Если я не упустил что-то важное в вашем вопросе, я бы сказал, что вы можете сделать это просто с помощью подстановки файлов:
ls -l p*
Эта команда выводит список файлов и каталогов, начинающихся с p
. Нет необходимости использовать grep
.
echo 'This is terrible, I feel terrible' | awk '{if ($NF~"^terri") $NF="good"; print}'
Это сделает это.
$NF
— поле в позиции NF
. В awk
это количество полей, поэтому это последнее поле.
$NF~"^terri"
использует ~
для сопоставления с регулярным выражением. Вы можете использовать ==
, если хотите получить точное совпадение.
$NF="good"
заменит поле, но только если выполняется условие if
.
Наконец, print
печатает всю запись.
echo '
210983342900 342832423-1 i2301rw1900 309212dw90 900
9328423ABC 32091840-943543-9435 3012=32193900 301 3029432 334
210983342900ABCDE 342832423-1 i2301rw1900 309212dw90 900
9328423 32091840-943ABC3-9435 3012=32193900 301 3029432 ABC
3843209898 48435843098543098543 43985439859209438543 499 ABC
' | awk '{if ($NF=="ABC") $NF="DEFG"; print}'
Сsed
:
sed -E 's/([[:blank:]]+)ABC$/\1whatever/' infile
-E
включает расширенное -регулярное -выражение, поэтому нам не нужно избегать здесь (
, )
или +
.
[:blank:]
соответствует только символам пробела или табуляции
[[:blank:]]
класс символов в регулярном выражении действителен только внутри скобок списка символов.
[[:blank:]]+
соответствует одному -или еще -символу пробела или табуляции
(...)
круглые скобки создают групповое соответствие, а \1
будет обратной -ссылкой для первой группы; \2
для второй, \3
для третьей и до -до \9
для девятой группы; мы определили только одно групповое совпадение.
ABC
точно соответствует строке ABC
.
$
— конец якоря
в замещающей части возвращаем обратно первое групповое совпадение с \1
; это используется для сохранения любых пробелов перед строкой ABC
, и она будет заменена строкой whatever
.
, чтобы заменить последнее поле наwhatever
:
sed -E 's/([[:blank:]]+)[^[:blank:]]*$/\1whatever/' infile
вы заметили ^
внутри скобки в [^[:blank:]]
? это символ отрицания, если он входит в класс символов -и сначала, поэтому данный класс символов -будет соответствовать любому символу, кроме пробела или табуляции. обратите внимание, что строка whatever
будет добавлена в конец строки, если строка заканчивалась конечными пробелами, поскольку квантификатор *
в [^[...]]*
, известный как ноль -или -больше символов. измените его на [^[:blank:]]+
, если вы не хотите, чтобы это произошло.