正则表达式匹配,但sed无法替换

时间:2019-12-12 13:31:26

标签: regex sed

我遇到了一个棘手的正则表达式问题

我有以下字符串

some_Name   _  _Bday Date Comm.txt

这是我的正则表达式,用于匹配空格和下划线

\_?\s\_?

Now when i try to replace the string using sed and the above regex

echo "some_Name   _  _Bday Date Comm.txt" | sed 's/\_?\s\_?/\_/g'

我想要的输出是

some_Name_Bday_Date_Comm.txt

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

您正在使用\_?\s\_?模式的POSIX BRE正则表达式引擎,该模式与_?,空格(如果您的sed支持\s速记)和{{ 1}}子字符串,即_?被当作文字问号符号。

您可以使用

?

请参见online sed demo

sed -E 's/[[:space:]_]+/_/g' sed 's/[[:space:]_]\{1,\}/_/g' POSIX ERE模式(通过[[:space:]_]+选项启用)将匹配一个或多个空格或下划线字符。

POSIX ERE -E量词可以在POSIX BRE中写为+。另外,如果您使用GNU \{1,\},则可以在第二个sed命令中使用\+

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -E 's/\s(\s*_)*/_/g' file

这将替换一个空格,后跟零个或多个以下字符:零个或多个空格后跟一个下划线。

相关问题