好的。
我知道这是一个微不足道的问题,但是:如何删除文件中两个已知模式/单词之间的行:
pattern1
garbage
pattern2
以获得:
pattern1
pattern2
还有谁知道学习sed的好(简单易懂的!)资源?带有许多清晰的例子?
sed -n '/pattern1/{p; :a; N; /pattern2/!ba; s/.*\n//}; p' inputfile
解释:
/pattern1/{ # if pattern1 is found
p # print it
:a # loop
N # and accumulate lines
/pattern2/!ba # until pattern2 is found
s/.*\n// # delete the part before pattern2
}
p # print the line (it's either pattern2 or it's outside the block)
编辑:
一些版本的sed
需要逐步输入指令才能正确执行:
sed -n -e '/pattern1/{' -e 'p' -e ':a' -e 'N' -e '/pattern2/!ba' -e 's/.*\n//' -e '}' -e 'p' inputfile
sed: -e expression #1, char 58: Unknown option to 's'
。我的 sed 版本是 3.02。 - kaspersed -n '/pattern1/,/pattern2/p; /pattern2/q' inputfile
。 - user332325echo -e 'aaa\npattern1\ncccxxx\ndddxxx \npattern2\nfff\nggg\npattern1\nAAAxxx\nBBBxxx \nCCCxxx\nDDDxxx\npattern2\nEEE\nFFF'
。 - Dennis Williamson这将适用于GNU和BSD sed:
sed '/pattern1/,/pattern2/{//!d;}' file
sed
(即Mac OSX)时遇到错误“d命令末尾有额外字符”,只需在d
后面添加;
,就像这样:
sed '/pattern1/,/pattern2/{//!d;}' file
。请注意,此操作不会更改原始意思,只是纠正错误并使其在Mac OSX上运行。 - rkdawk '/pattern1/{g=1;next}/pattern2/{g=0;next}g' file
sed '/PATTERN1/,/PATTERN2/d' FILE
你也可以使用Unix文本编辑器ed:
echo '
pattern1
garbage
pattern2
' > test.txt
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s test.txt &>/dev/null
H
/pattern1/+1,/pattern2/-1d
wq
EOF
更多信息请参见:使用ed文本编辑器从脚本中编辑文件