【问题标题】:Sed: Print lines between string and another string in one lineSed:在一行中打印字符串和另一个字符串之间的行
【发布时间】:2013-11-18 12:59:33
【问题描述】:

我在一个目录中有 100 个 html 文件

我需要从每个匹配正则表达式的文件中打印一行,同时打印两个正则表达式之间的行。

下面的命令正确地提供了结果

sed -n '/string1/p' *.html >result.txt
sed -n '/string2/,/string3/p' *.html > result2.txt

但我需要它们在一个 result.txt 文件中,格式为

string1
string2
string3

我一直在尝试使用 grep、awk 和 sed 并搜索过,但我没有找到答案。

任何帮助将不胜感激。

【问题讨论】:

  • 我不太明白。你有两个不同的问题? 1) 打印每个匹配正则表达式 1 的 *.html 行和 2) 打印每个 *.html 中匹配 2 个正则表达式的行之间的行?但是您想为每个 X.html 将这些输出合并到一个 X.txt 中吗? (你能用 Perl/Python 吗?)
  • 理想情况下,我想使用一行 sed,查看每个文件并打印匹配正则表达式的字符串和 2 个正则表达式之间的字符串。然后将输出发送到 result.txt,这样我就可以从 100 个文件中得到 100 行 string1 string2 string3

标签: sed


【解决方案1】:

这可能对你有用:

sed -n '/string1/p;/string2/;/string3/p' INPUTFILE > OUTPUTFILE

或者这里是awk 解决方案:

awk '/string1/ { print }
     /srting2/ { print ; p = 1 } 
     p == 1 { print }
     /string3/ { print ; p = 0 }' INPUTFILE > OUTPUTFILE

【讨论】:

  • 我相信你想说的是/string2/,而不是/string2/;
  • sed -n '/string1/p;/string2/,/string3/p' INPUTFILE > OUTPUTFILE 是完美的。非常感谢(请将 ; 修改为 ,
【解决方案2】:

只需将两个 SED 表达放在一个调用中:

echo $'a\nstring1\nb\nstring2\nc\nstring3\nd\n' | \
sed -n -e '/string1/p' -e '/string2/,/string3/p'

输入是:

a
string1
b
string2
c
string3
d

输出是:

string1
string2
c
string3

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-04-04
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多