sed / awk: заменить N вхождением - PullRequest
0 голосов
/ 05 июля 2011


можно изменить 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


Спасибо

Ответы [ 2 ]

7 голосов
/ 06 июля 2011

Для изменения 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'
2 голосов
/ 06 июля 2011

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

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