【问题标题】:How to add a prefix to all lines that don't start with one of multiple words如何为不以多个单词之一开头的所有行添加前缀
【发布时间】:2021-04-27 06:58:15
【问题描述】:

我正在尝试使用 sed 为文件中不以多个单词之一开头的所有行添加前缀。

例子:

someText
sleep 1
anotherString
sleep 1
for i in {1..50}
do
command
sleep 1
secondCommand
sleep 1
done

应该变成

PREFIX_someText
sleep 1
PREFIX_anotherString
sleep 1
for i in {1..50}
do
PREFIX_command
sleep 1
PREFIX_secondCommand
sleep 1
done

我能够排除以单个模式词开头的任何行(即:sleep、for、do、done),但我不知道如何排除以多个模式之一开头的所有行。 目前我使用以下命令:

sed -i '/^sleep/! s/^/PREFIX_/'

这在从睡眠开始的所有行上都可以正常工作。 我想有一些方法可以组合模式词,但我似乎找不到解决方案。 像这样的东西(显然不起作用):

sed -i '/[^sleep;^for;^do]/! s/^/PREFIX_/'

任何帮助将不胜感激。

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    使用多个单词的交替来否定:

    sed -i -E '/^(sleep|for|do)/! s/^/PREFIX_/' file
    
    PREFIX_someText
    sleep 1
    PREFIX_anotherString
    sleep 1
    for i in {1..50}
    do
    PREFIX_command
    sleep 1
    PREFIX_secondCommand
    sleep 1
    done
    

    /^(sleep|for|do)/! 将匹配除以sleepfordo 开头的行以外的所有行。

    【讨论】:

      【解决方案2】:

      我喜欢 awk。

      awk '/sleep|for|do/ { print; next; } { print "PREFIX_" $0 }' filename
      

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 1970-01-01
        • 2012-04-05
        • 2011-01-07
        • 1970-01-01
        • 2014-07-25
        • 2017-01-27
        • 1970-01-01
        相关资源
        最近更新 更多