sed: одновременная замена на месте и распечатка измененных строк?

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

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 как изменить линии в-в файл, и печать измененных строк в stdout из одной командной строки?

1 ответов


на 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