Как выбрать конкретное слово из txt файла с помощью grep в терминале Ubuntu

У меня есть a txt файл. В том файле я хочу отфильтровать конкретное слово.

Пример:

$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.

Я хочу вывод как:

PILOT_FIRSTNAME

PILOT_LASTNAME

С чем все слова $, то слово только выбирает?

4
задан 23 August 2016 в 23:52

2 ответа

Используя PCRE grep (perl-совместимое регулярное выражение) режим:

$ grep -Po '\$\K\w*' yourfile
PILOT_FIRSTNAME
PILOT_LASTNAME
  • \$: соответствуйте литералу $
  • \K: (проигнорируйте его)
  • \w: сопровождаемый нулем или большим количеством словесных символов
<час>

, Если Вы хотите к соответствие и сохраняете литерал $ символ, затем Вам не нужно \K модификатор - и на самом деле Вам не нужен PCRE вообще, можно просто использовать

$ grep -o '\$\w*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME

или (возможно, более портативно)

grep -o '\$[_[:alnum:]]*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME
5
ответ дан 1 December 2019 в 08:59

Таким образом, если Вы хотите распечатать поля файла как новая строка, разделенная, если запускается с $, можно сделать:

awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt

Расширенная форма:

awk '{
    for (i=1;i<=NF;i++)
        { if($i~/^\$/)
                { printf "%s\n",substr($i,2) }
        }
     }' file.txt

Здесь мы выполняем итерации по полям (for (i=1;i<=NF;i++)), если поле запускается с $ (if($i~/^\$/)), то печать его с запаздывающей новой строкой, начинающей со второго символа (printf "%s\n",substr($i,2)).

<час>

, С другой стороны, если количество полей фиксируется и не многие, то sed также жизнеспособный вариант, здесь принимая два поля:

sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt

Соответствие $ в начале разделенного поля каждого пробела, получая поле (([^[:blank:]]+)), затем в замене установило поля, поскольку новая строка отделилась (1\n\2).

<час>

Пример:

$ cat file.txt
$PILOT_FIRSTNAME $PILOT_LASTNAME
$FOO $BAR
PILOT_FOO PILOT_BAR

$ awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR

$ sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR
5
ответ дан 1 December 2019 в 08:59

Другие вопросы по тегам:

Похожие вопросы: