换行符后,SED脚本在多行模式中不匹配单个

时间:2015-04-29 14:14:37

标签: regex bash sed

我正在尝试生成一个转换

的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突然无法匹配以*结尾的单行?

感谢您的帮助!

1 个答案:

答案 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
相关问题