sed:如何删除文件中的第二个匹配项

开发太阳能

我有一个看起来像这样的文件(伪代码):

---
foo: bar
bar: baz
---
baz: quz
---
Some text
Some text
Some text

我只需要删除第二 ---行。我知道sed可以做到这一点,但是我从来没有能够sed找到我能找到的任何文件的头绪...

温特穆特

使用sed时,最简单的方法是首先将整个文件读入模式空间并进行处理:

sed ':a $!{N; ba}; s/\(^\|\n\)---\n/\n/2' filename

这确实

:a                       # jump label for looping
$!{                      # if the end of input is not reached
  N                      # fetch the next line, append it to the pattern space
  ba                     # go back to :a
}                        # after this, the whole file is in the pattern space.
s/\(^\|\n\)---\n/\n/2    # then: remove the second occurrence of a line that
                         # consists only of ---

@ mklement0指出,\|仅适用于GNU sed。解决该问题的一种方法是,由于\|仅需抓住---第一行,

sed ':a $!{ N; ba; }; s/^/\n/; s/\n---\n/\n/2; s/^\n//' filename

这样做:

:a $!{ N; ba; }  # read file into the pattern space
s/^/\n/          # insert a newline before the first line
s/\n---\n/\n/2   # replace the second occurrence of \n---\n with \n
s/\n//           # remove the newline we put in at the beginning.

这样,第一行不再是特例。

无需将整个文件读入缓冲区,就必须从字符构造一个计数器:

sed '/^---$/ { x; s/.*/&_/; /^__$/ { x; d; }; x; }' filename

那是:

/^---$/ {    # if a line is ---
  x          # exchange pattern space and hold buffer
  s/.*/&_/   # append a _ to what was the hold buffer
  /^__$/ {   # if there are exactly two in them
    x        # swap back
    d        # delete the line
  }
  x          # otherwise just swap back.
}

...或只是使用awk:

awk '!/^---$/ || ++ctr != 2' filename

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

sed读取一个文件并删除第二个文件中的模式

删除倒数第二个和第二个匹配项之间的所有内容

如何根据第二个文件中的信息删除文件中的某些列?

删除与Shell脚本中第二个文件中的前2个字段匹配的文件中的行

如何使用sed从文件中每隔第二个和第四个逗号分隔的单词删除一个文件?

如果它们恰好匹配第二个文件中的字符串,如何从一个文件中删除字符串?

如果第一个文件的行与Linux中第二个文件中存在的字符串匹配,如何删除该行?

根据第二个文本文件从文本文件中删除重复项

Excel公式查找第二个匹配项

sed +仅替换第二个匹配词

如何匹配字符串并删除第二个匹配字符串

jQuery:删除了第二个匹配的元素

RegEx - 如何使用 grep 提取第二个匹配项

如何在不替换整行的情况下替换第二个匹配项

嵌套的awk从第二个匹配项中显示特定字符串并显示

根据第二个集合中的匹配项进行汇总

获取 Google Sheets 中第二个匹配项的索引

如何找出两个文件并从第二个文件中删除公用条目

比较两个文件并从第二个文件中获取匹配的行

连接第二个列表时,从列表中查找和删除重复项

sed +如何删除第二个字符“。” 从线

如何使用sed在字符串的第二个句点后删除

如何比较一个文件的多列和另一文件的一列并显示第二个文件的匹配项?

删除在第二个文件中找到的单词

将文件中的重复数据与第二个文件中的第二列进行匹配

在Excel中,如何返回列表中单元格的匹配号(即,它是第一个还是第二个匹配项)

如何匹配两个列表,而只更改每个对中的第二个?

列出与第二个文件中的关键字不匹配的全行

删除倒数第二个与倒数第二个匹配之间的所有内容