正确使用sed正则表达式中的分隔符

时间:2014-12-15 04:34:59

标签: regex sed

sed的新手,所以试图找出以下问题。

sed -e "s/menuentry \"test.*(/menuentry \"test image ${VERSION} (/" \
    -e "s/menuentry \"Lost password change.*(/menuentry \"Lost password change ${VERSION} (/" \
    -e "sX/boot/[A-Za-z0-9\.\-\@_]*X/boot/${VERSION}Xg" \
    < test.txt

上面的表达,第3部分

-e "sX/boot/[A-Za-z0-9\.\-\@_]*X/boot/${VERSION}Xg" gives an error 

sed:-e表达式#3,char 37:`s'的未知选项 如果$ VERSION = FIX,即包含“X”。

处理此问题的更好方法是什么?使用另一个字符作为分隔符,我尝试“:”并且它有效。

1 个答案:

答案 0 :(得分:1)

要求救援!

VERSION=FIX

awk -v VERSION="$VERSION" \
    '{
       sub (/menuentry "test.*\(/                , "menuentry \"test image " VERSION " ("          );
       sub (/menuentry "Lost password change.*\(/, "menuentry \"Lost password change " VERSION " (");
       gsub("/boot/[A-Za-z0-9.@_-]*"             , "/boot/" VERSION                                );
       print;
     }' \
    < foo.txt

将变量替换为sed命令是Not A Good Idea™,正是因为您遇到的原因。当您发现自己想要这样做时,请考虑使用awk。它不那么性感,但它没有这个特殊的问题。