У меня есть a txt
файл. В том файле я хочу отфильтровать конкретное слово.
Пример:
$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.
Я хочу вывод как:
PILOT_FIRSTNAME
PILOT_LASTNAME
С чем все слова $
, то слово только выбирает?
Используя 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
Таким образом, если Вы хотите распечатать поля файла как новая строка, разделенная, если запускается с $
, можно сделать:
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