sed: одновременная замена на месте и распечатка измененных строк? - PullRequest
6 голосов
/ 23 ноября 2011

Скажите, у меня есть этот файл:

cat > test.txt <<EOF
line one word
line two word
line three word
line one two word
EOF

И скажем, я хочу заменить все слова «два» на «ДВА», inline вместо в файле test.txt.

Теперь я обычно создаю «предварительный просмотр» (с -n не печатаются строки, а затем с /p - печатаются только совпадающие строки):

$ sed -n 's/two/TWO/gp' test.txt 
line TWO word
line one TWO word

... а затем я обычно выполняю фактическую замену на месте (с -i и без /p):

$ sed -i 's/two/TWO/g' test.txt
$ cat test.txt 
line one word
line TWO word
line three word
line one TWO word

Есть ли способ получить sed для обеих строк изменений на месте в файле, и распечатать измененные строки в стандартный вывод из одной командной строки?

1 Ответ

8 голосов
/ 23 ноября 2011

В Linux вы можете обойтись без:

sed -i '/two/{s/two/TWO/g; w /dev/stdout}' test.txt

В системах BSD (включая Mac OS X), где sed имеет слегка эксцентричные правила о том, когда вы можете комбинировать действия наодну строку мне пришлось использовать:

sed -i '/two/{s/two/TWO/g; w /dev/stdout
       }' test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...