正则表达式替换可选下划线

3
我需要根据情况删除下划线,如果存在的话。
string VIEW VXABC expected result VIEW ABC
string VIEW V_XABC expected result VIEW ABC

这是我的尝试,但结果一直无法得到。
echo "VIEW VXABC" |sed 's/VIEW V_?X/VIEW ABC/'
VIEW VXABC
3个回答

3
[me@home]$ echo VIEW V_XABC | sed -r 's/VIEW V_?X/VIEW /' 
VIEW ABC
[me@home]$ echo VIEW VXABC | sed -r 's/VIEW V_?X/VIEW /' 
VIEW ABC

请注意-r选项。根据man页面的说明:

-r, --regexp-extended
    use extended regular expressions in the script.

1

请检查这是否有帮助。

 sed -e 's/\(VIEW \)V[_X]\+\(ABC\)/\1 \2/'
testing
testing
VIEW VXABC
VIEW  ABC
VIEW V_XABC
VIEW  ABC

是的,这也可以工作。您能否详细说明一下您的正则表达式是做什么的? - jhon.smith
() 用于捕获。**[]** 是字符类。+ 表示前一个标记的一个或多个。 - tuxuday
非常感谢您的解释,是的,您的答案不仅正确,而且具有教育意义。希望我能同时掌握这两个答案。 - jhon.smith

0
尝试使用“扩展正则表达式”开关-E
echo "VIEW VXABC" | sed -E 's/VIEW V_?X/VIEW ABC/'

sed的man页面中:

-E, -r, --regexp-extended

在脚本中使用扩展正则表达式(为了可移植性,请使用POSIX -E)


只是一件小事 - 如果您想要剝離V_?X,上面的內容會讓您得到VIEW ABCABC。輸入“VIEW VXABC” | sed -E 's/V_?X//' - Kelly
echo VIEW V_XABC | sed -e 's/VIEW V_?X/VIEW ABC/' VIEW V_XABC 无法进行替换。 - jhon.smith
大写字母'E'?你在使用哪个shell?虽然不应该有影响,但是...我正在使用BASH,这是我的输出:$>echo "VIEW VXABC" | sed -E 's/V_?X//' --> VIEW ABC - Kelly
echo VIEW V_XABC | sed -e 's/VIEW V(_)?X/VIEW ABC/' VIEW ABC - jhon.smith
回显“VIEW VXABC”| sed -E 's / VIEW V_?X / VIEW ABC /' sed:无效选项- E,我正在使用Bash,在我的sed版本中没有大写字母E选项。 - jhon.smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接