拆分线路,并使用sed在每条新线路上运行

拆分线路,并使用sed在每条新线路上运行,sed,Sed,我希望在不使用bash的情况下执行此操作,即不将一个sed命令的输出管道化到另一个命令中 是否可以使用sed(例如在给定字符处)拆分行,然后在每个新创建的行上独立执行下一个sed命令 换句话说,我可以在模式空间中以多行内容结束一个循环,然后为每一行开始一个新的循环吗?我相信D命令会有所帮助:它从模式空间中删除“最新”行(最底部),然后在不读取输入行的情况下开始新的循环 示例: 给定此文件“thing.txt”: 我在“-”处拆分行,然后在每一行上执行我的工作 这样做很简单:sed's/-/\n/

我希望在不使用bash的情况下执行此操作,即不将一个
sed
命令的输出管道化到另一个命令中

是否可以使用
sed
(例如在给定字符处)拆分行,然后在每个新创建的行上独立执行下一个sed命令

换句话说,我可以在模式空间中以多行内容结束一个循环,然后为每一行开始一个新的循环吗?我相信
D
命令会有所帮助:它从模式空间中删除“最新”行(最底部),然后在不读取输入行的情况下开始新的循环

示例:

给定此文件“thing.txt”:

我在“
-
”处拆分行,然后在每一行上执行我的工作

这样做很简单:
sed's/-/\n/g'| sed's/^.*$/Hey/'thing.txt
,它会在每个生成的行中输出一个“Hey”:

我可以在单个sed脚本中实现这一点吗

[编辑]

上面的例子不是最好的,所以我想做的就是:

我有一个包含代码的文件,我只想对未注释的部分执行替换。因此,我应该在每一行上执行以下循环:

  • 如果行以
    #
    开头,则跳过
  • 如果行以注释结尾,则将注释放在新行上,然后重新开始
  • 否则,进行替换(替换)
  • 例如,给定此文件:

    # bla
    echo bla  # say bla
    exit
    
    我只想在未注释时用bla替换bla:

    结果应该是

    # bla
    echo BLA  # say bla
    exit
    

    这很容易使用:
    sed-r的/(.+)(#.$)/\1\n\2/“infle | sed”/^#/!{s/bla/bla/g}'

    尝试以下方法(在GNU sed中测试),如果这对您有帮助,请告诉我

    sed 's/[^-]*/Hey/g;s/-/\n/g'   Input_file
    
    请尝试以下(在GNU sed中测试)并让我知道这是否对您有帮助

    sed 's/[^-]*/Hey/g;s/-/\n/g'   Input_file
    
    你可以这样试试

    sed '/#/s//\n#/;tA;s/\bbla/BLA/;b;:A;s/\(.*\)\(\bbla\)\(.*\n.*\)/\1BLA\3/;tA;s/\n//' infile
    
    你可以这样试试

    sed '/#/s//\n#/;tA;s/\bbla/BLA/;b;:A;s/\(.*\)\(\bbla\)\(.*\n.*\)/\1BLA\3/;tA;s/\n//' infile
    
    输出

    # bla
    echo BLA  # say bla
    exit
    

    是否需要进行sed

    perl -ne '
        @parts = split /#/; 
        $parts[0] =~ s/(bla)/uc $1/ge; 
        print join "#", @parts
    ' file
    

    输出

    # bla
    echo BLA  # say bla
    exit
    

    是否需要进行sed

    perl -ne '
        @parts = split /#/; 
        $parts[0] =~ s/(bla)/uc $1/ge; 
        print join "#", @parts
    ' file
    

    这可能适用于您(GNU-sed):

    如果一条线不包含中间线,请退出。否则,在第一个
    #
    之前插入一个换行符,并将该行复制到保留空间(HS)。模式空间(PS)中的大写字母all
    bla
    ,然后附加HS中的原始行。删除两行中不需要的部分并打印结果

    可以在
    #
    上拆分该行,以便:

    sed 's/\([^#]\)#/\1\n#/;T;h;s/bla/\U&/g;G;s/\n.*\n.*\n//;s/#/\n#/' file
    
    这可能适用于您(GNU-sed):

    如果一条线不包含中间线,请退出。否则,在第一个
    #
    之前插入一个换行符,并将该行复制到保留空间(HS)。模式空间(PS)中的大写字母all
    bla
    ,然后附加HS中的原始行。删除两行中不需要的部分并打印结果

    可以在
    #
    上拆分该行,以便:

    sed 's/\([^#]\)#/\1\n#/;T;h;s/bla/\U&/g;G;s/\n.*\n.*\n//;s/#/\n#/' file
    

    嗯,我同意它在这种情况下是有效的,它相当于
    sed的/-/\n/g;s/^.*$/hey/gM;='thing.txt(使用多行替换模式),但这并不适用于其他情况。我将编辑我的问题以使其更清楚,对此我深表歉意。@PlasmaBinturong,当然请编辑您的问题并让我们更清楚地知道,那么我也会相应地编辑我的答案。嗯,我同意在这种情况下它是有效的,它相当于
    sed的/-/\n/g;s/^.*$/hey/gM;='thing.txt(使用多行替换模式),但这并不适用于其他情况。我将编辑我的问题以使其更清楚,对此我深表歉意。@PlasmaBinturong,当然请编辑您的问题并让我们更清楚地知道,我也将相应地编辑我的答案。糟糕。不喜欢复杂的sed程序。哇,太棒了!是的,很抱歉坚持使用sed,我想更好地理解它迷人的语法。这很有帮助!是的,这有助于理解“迷人的语法”,但我想我会使用您的双sed调用-更容易理解-也更容易执行该调用,例如,用于行拆分的awk(由于印刷错误-应该有一个换行符),然后使用sed编辑有格式错误的文本。恶心。不喜欢复杂的sed程序。哇,太棒了!是的,很抱歉坚持使用sed,我想更好地理解它迷人的语法。这很有帮助!是的,有助于理解“迷人的语法”,但我想我会使用您的双sed调用-更容易理解-也更容易执行该调用,例如,行拆分的awk(由于印刷错误-应该有一个换行),然后使用sed编辑有格式错误的文本。看起来它只会大写找到的第一个bla。看起来它只会大写找到的第一个bla。
    
    sed 's/\([^#]\)#/\1\n#/;T;h;s/bla/\U&/g;G;s/\n.*\n.*\n//;s/#/\n#/' file