【问题标题】:sed: replace a line containing a patternsed:替换包含模式的行
【发布时间】:2013-08-22 22:54:05
【问题描述】:

我看到了很多关于 sed 命令的问题,但没有一个与我的兄弟相匹配。

我想替换包含模式的整行。

我认为sed 命令是最好的选择。我从这个sed 命令开始,但不起作用

sed -i 's/pattern/Substitution/' myfile.txt

之后我用这个其他命令进行测试,但只替换模式,而不是整行。

echo "hello y luego bye" | sed "s|hello|adeu|g"

【问题讨论】:

    标签: regex shell sed replace


    【解决方案1】:

    您需要匹配包含该模式的整行,然后替换。像这样使用它:

    sed 's/^.*\bpattern\b.*$/Substitution/' file
    

    我还为单词边界添加了\b,以便您只匹配pattern,但避免匹配patterns

    解释: ^.*\bpattern\b.*$ 我们用来确保整行匹配包含模式。 ^ 是行首,$ 是行尾。 .* 匹配 0 个或更多长度的文本。所以^.* 匹配pattern 之前的所有文本,.*$ 匹配pattern 之后的所有文本。

    使用 awk 你可以做到:

    awk '!/affraid/{print} /affraid/{print "Substitution"}' file
    

    【讨论】:

    • 谢谢,完美。但是你能解释一下模式之前的'^.*'和之后的'.*$'是什么意思吗?提前致谢。
    • 我不明白你对 \b 的解释,因为没有 \b 效果很好。
    • \b 用于单词边界。使用\b 匹配字符串将是:^.*pattern.*$,它也可以匹配一行,例如:123 mypatterns foo,但是当我使用^.*\bpattern\b.*$ 时,它不会匹配该行。
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多