分割线并使用sed操作每个新行

时间:2017-10-26 13:58:24

标签: sed

我想在没有bash的情况下执行此操作,即不将一个sed命令的输出传递给另一个。{/ p>

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

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

示例:

鉴于此文件" thing.txt":

thing1-thing2
thing3

我在" -"上拆分行,然后在每个新行上执行我的操作。

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

Hey
Hey
Hey

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

[编辑]

上面的例子并不是最好的,所以这正是我想做的事情:

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

  1. 如果行以#开头,请跳过
  2. 如果行以注释结束,请将注释放在新行上,然后重新开始;
  3. 否则,做一些事情(替换)
  4. 例如,给定此文件:

    # bla
    echo bla  # say bla
    exit
    

    我想在取消注释后用BLA替换bla:

    结果应该是

    # bla
    echo BLA  # say bla
    exit
    

    # bla
    echo BLA
    # say bla
    exit
    

    这很容易:sed -r 's/(.+)(#.*$)/\1\n\2/' infile | sed '/^#/!{s/bla/BLA/g}'

4 个答案:

答案 0 :(得分:2)

你可以尝试那样

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

答案 1 :(得分:1)

sed '
    h                  # copy pattern space to hold space
    s/#.*//            # delete comment in pattern space
    s/bla/\U&/g        # uppercase the blas
    x                  # exchange pattern and hold space
    s/.*\(#.*\)/\1/    # delete stuff before a comment
    t A                # if found, goto A
        s/.*//         # otherwise no comment, delete everything
    : A
    H                  # append pattern space to hold space
    x
    s/\n//g            # remove newlines
' file

输出

# bla
echo BLA  # say bla
exit

是否需要

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

awk -F'#' -v 'OFS=#' '{gsub(/bla/, "BLA", $1); print}'

答案 2 :(得分:0)

尝试按照并告诉我这是否对您有所帮助。(在GNU sed中测试)

sed 's/[^-]*/Hey/g;s/-/\n/g'   Input_file

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

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

该行可能会在#上拆分,所以:

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