我正在尝试生成一个转换
的sed脚本&&a_x* &&b_x;cx &&d_x*
到
a_x
ax
b_x
cx
d_x
dx
*
应该会删除已复制的_
,;
一个简单的换行符。
我有一个SED脚本,首先插入换行符(包括使用;
的操作),然后在没有_
的情况下为复制执行多行模式。
如果我将多行模式移动到单独的脚本文件中并管道执行换行符的指令输出,则可以使用多行模式。
由于一些奇怪的原因,单个脚本文件不会 - 这是我出于维护原因所需要的。
以下是合并后的版本:
#!/bin/sed -f
# Remove whitespaces
s/\ //g
# Linebreak on &&
s/\&\&/\
\&\&/g
### Linebreak on ;
s/\;/\
/g
# Remove extra new line
s/\n//
:extendvars
/^..*\*$/ {
l //DEBUG SWITCH
h
s/\(\&\|\*\)\(\&\|\*\)*//g
p
g
s/\(\&\|_\|-\|\*\)\(\&\|_\|-\|\*\)*//g
p
d
bextendvars;
}
调试开关' l'在多行模式的第一行中,应仅匹配以*结尾的行,但匹配所有行和输出
&&a_x*\n&&b_x\bx\n&&c_x*$
在错误的合并版本中。管道时,sed正确识别模式:
&&a_x*$ ... &&c_x*$
输出错误(合并版本):
&&a_x*\n&&b_x\nbx\n&&c_x*$
a_x
b_x
bx
c_x
ax
bx
bx
cx
正确输出(管道版):
&&a_x*$
a_x
ax
&&b_x
bx
&&c_x*$
c_x
cx
我用
运行脚本sed -f [SCRIPTNAME] <old >new
在此版本中,我已从&&
jet中删除了&&b_x
。
即使在一个脚本中执行所有语句,如何让SED识别正确的模式?
为什么SED突然无法匹配以*
结尾的单行?
感谢您的帮助!
答案 0 :(得分:1)
简单的awk比sed更具可读性。试试这个awk
命令:
s='&&a_x* &&b_x;cx &&d_x*'
echo "$s" | awk -F '\\*' -v RS='&&|;' 'NF{s=$1;print s} NF==2{sub(/_/, "", s);print s}'
a_x
ax
b_x
cx
d_x
dx