我遇到了一个棘手的正则表达式问题
我有以下字符串
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
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
您正在使用\_?\s\_?
模式的POSIX BRE正则表达式引擎,该模式与_?
,空格(如果您的sed
支持\s
速记)和{{ 1}}子字符串,即_?
被当作文字问号符号。
您可以使用
?
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
这将替换一个空格,后跟零个或多个以下字符:零个或多个空格后跟一个下划线。