[英]removing lines between two patterns (not inclusive) with sed
行
我知道这是一个微不足道的问题,但是:如何从两个已知模式/单词之间的文件中删除行:
模式1
垃圾
模式2
获得:
模式1
模式2
有没有人知道学习 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 '/pattern1/,/pattern2/{//!d}' file
awk '/pattern1/{g=1;next}/pattern2/{g=0;next}g' file
这个sed代码也可以运行:
sed '/PATTERN1/,/PATTERN2/d' FILE
您也可以使用Unix文本编辑器编辑:
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文本编辑器编辑文件
对我来说,“sed '\/PATTERN1\/,\/PATTERN2\/d' FILE”正在工作(在 PATTERN1 和最后一次出现的 PATTERN2 之间)
但我有一个问题:如果 PATTERN2 多次出现,我怎样才能让它工作直到第一次出现 PATTERN2,而不是最后一次?
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.