【发布时间】:2015-04-29 14:14:36
【问题描述】:
我正在尝试生成一个可以转换的 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
在这个版本中,我从 &&b_x jet 中删除了 &&。
即使在一个脚本中执行所有语句,如何让 SED 识别正确的模式?
为什么 SED 突然无法匹配以 * 结尾的单行?
感谢您的帮助!
【问题讨论】: