用sed去除两个模式之间的线(不包括在内)

时间:2011-02-21 22:18:14

标签: bash sed

确定

我知道这是一个微不足道的问题,但是:如何从两个已知模式/单词之间的文件中删除行:

  

模式1
  垃圾
  PATTERN2

获得:

  

模式1
  PATTERN2

有没有人知道用于研究sed的好(简单的书面!)资源?有很多明显的例子吗?

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:9)

这可能对您有用:

sed '/pattern1/,/pattern2/{//!d}' file

答案 2 :(得分:4)

使用awk很容易做到:

BEGIN { doPrint = 1; }
/pattern1/ { doPrint = 0; print $0; }
/pattern2/ { doPrint = 1; }
{ if (doPrint) print $0; }

我发现sed info相当容易阅读,有很多例子。 awk也是如此。

答案 3 :(得分:4)

awk '/pattern1/{g=1;next}/pattern2/{g=0;next}g' file

答案 4 :(得分:1)

此sed代码也可以使用:

sed '/PATTERN1/,/PATTERN2/d' FILE

答案 5 :(得分:0)

您也可以使用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

有关详细信息,请参阅:Editing files with the ed text editor from scripts