LINUX.ORG.RU

sed: Заменить то, что не подходит под маску

 ,


0

2

Приветствую всех. Не могу справиться с sed-ом, прошу помощи. Есть файл csv (табуляция), в котором нужно делать несколько замен. Сделал файл с масками. Условно такого содержания:

masks.sed:

s/\abc/1/g s/\def/2/g s/\_123.*/3/g

И вызываю его из bash-скрипта.

sed -f masks.sed inputfile.csv > outputfile.csv

С этими тремя шаблонами все просто и понятно. Нужно так же выполнить замену на 4 всего, что НЕ подходит по последней маске _123, но начинается с подчеркивания. Как это описать в виде еще одного шаблона?

Иными словами, _1234564, _12378 заменить на 3, а _23412, _321453 заменить на 4.


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

+[~]$ echo 'Иными словами, _1234564, _12378 заменить на 3, а _23412, _321453 заменить на 4.' |
      sed -e 's/\_123[[:digit:]]\+/3/g' -e 's/\_[[:digit:]]\+/4/g'
Иными словами, 3, 3 заменить на 3, а 4, 4 заменить на 4.
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо большое, но, похоже, не получается.

Есть два столбца со значениями «_цифры». Совпадение (и несовпадение) с маской _123 может быть как в первом из них, так и во втором, так и в обоих одновременно.

Наверное, придется городить скрипт awk.

s45rus
() автор топика
Ответ на: комментарий от s45rus

Прошу прощения, работает так, как нужно. Еще раз спасибо.

s45rus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.