我想在没有bash的情况下执行此操作,即不将一个sed
命令的输出传递给另一个。{/ p>
是否可以使用sed
(例如,在给定字符处)拆分行,然后然后在每个新创建的行上执行下一个sed命令 ?
换句话说,我可以在模式空间中结束具有多行内容的循环,然后为这些行中的每一行开始一个新循环吗?我相信D
命令可以提供帮助:它会删除最新的"从模式空间开始的行(最底部),然后在不读取输入行的情况下开始新的循环。
示例:
鉴于此文件" thing.txt":
thing1-thing2
thing3
我在" -
"上拆分行,然后在每个新行上执行我的操作。
这样做很简单:sed 's/-/\n/g' | sed 's/^.*$/Hey/' thing.txt
,输出一个"嘿"每生成的行:
Hey
Hey
Hey
我可以在一个sed脚本中实现这个吗?
[编辑]
上面的例子并不是最好的,所以这正是我想做的事情:
我有一个包含代码的文件,我想只对未注释的部分执行替换。所以我应该在每一行上执行以下循环:
#
开头,请跳过例如,给定此文件:
# 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}'
。
答案 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