sed поиск и замена последнего поля строки

Если я не упустил что-то важное в вашем вопросе, я бы сказал, что вы можете сделать это просто с помощью подстановки файлов:

ls -l p*

Эта команда выводит список файлов и каталогов, начинающихся с p. Нет необходимости использовать grep.

-2
01.12.2020, 16:22
2 ответа
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}'
1
18.03.2021, 22:46

С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:]]+, если вы не хотите, чтобы это произошло.

0
18.03.2021, 22:46

Теги

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