sed/awk: заменить вхождение N


можно ли изменить N (например, второе вхождение) в файле с помощью однострочного sed/awk кроме такого метода?:

line_num=`awk '/WHAT_TO_CHANGE/ {c++; if (c>=2) {c=NR;exit}}END {print c}' INPUT_FILE` && sed  "$line_num,$ s/WHAT_TO_CHANGE/REPLACE_TO/g" INPUT_FILE > OUTPUT_FILE


Спасибо


person Vitaliy    schedule 05.07.2011    source источник


Ответы (2)


Чтобы изменить N-е вхождение в строке, вы можете использовать это:

$ echo foo bar foo bar foo bar foo bar | sed 's/foo/FOO/2'
foo bar FOO bar foo bar foo bar

Поэтому все, что вам нужно сделать, это создать «однострочный» текст, например. используя tr

tr '\n' ';'

выполните замену, а затем снова преобразуйте ее в многострочную, используя

tr ';' '\n'
person Fredrik Pihl    schedule 05.07.2011
comment
Спасибо, хороший трюк с TR - потому что без этого 's/foo/FOO/2' у меня не работает - person Vitaliy; 06.07.2011

Это awk-решение предполагает, что WHAT_TO_CHANGE встречается только один раз в строке. Следующее заменяет второй «один» на «ДВА»:

awk -v n=2 '/one/ { if (++count == n) sub(/one/, "TWO"); } 1' file.txt
person Hai Vu    schedule 05.07.2011