为什么Sed无法替换包含的行。 +和*

时间:2017-10-02 14:12:27

标签: linux file sed

我有一个大文件,其中一些行如下:

....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*

我想用...+PUNCT

替换.... + UNKNOWN 部分

为此,我做了以下事情:

sed 's/\.\.\.\.\+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out

然而,没有一条线路消失了。

grep -F '...+*UNKNOWN*' myfile.out 

....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*

我无法找到我的错误,你能帮帮我吗?

3 个答案:

答案 0 :(得分:1)

sed的某些版本中,\+具有特殊含义,请使用+来按字母顺序匹配。

答案 1 :(得分:0)

请你试试。

sed 's/+\*UNKNOWN/+PUNCT/'  Input_file

+举例说明:

echo "This is an example: 123 test 123" | sed -E  's/^[^0-9]*([0-9]+).*/\1/'
123

假设我们有一行This is an example: 123 test 123,所以这里[0-9]+将匹配第一组数字,这些数字汇集在一起​​然后将它们保存在sed的内存中我正在打印它们使用\1(再次转义1让sed知道它是我在这里调用的内存序列。)

答案 2 :(得分:0)

sed中的

\+表示在“+”之前的表达式的一个或多个匹配,表示没有+字面值。
要匹配文字“+”,请使用+来匹配文字中的加号。

修改后的表达式:

sed 's/\.\.\.\.+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out