使用sed中的regex查找并替换文件中的字符串。脚本不起作用

时间:2016-10-05 15:54:50

标签: unix sed grep

我有一个文件,我必须按特定模式(电话号码)查找和更改字符串。正则表达式是:

^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$

当我在命令中使用它时:

grep "^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$" -E filename

有效。但是当我尝试在sed中使用它来用空格替换所有括号并在13和15位置添加空格时,它不起作用,我也没有想法。

我的变种是:

sed '/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/s/[()]//' filename

(仅用于替换括号)

sed -e '/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/s/[()]//' -e '/^+[0-9]{2} ([0-9]{2}) [0-9]{7}/s/./& /11;s/./& /14' filename

文件结构:

    +380 44 123 45 67
    +380 (44) 1234567
    +350 (56) 1454557
    +330 (76) 1255557
    +380 44 3534 45 67
    +320 (45) 1237887
    +310 (54) 1939997
    adasd
    asdddddddddddd
    sssdad

预期产出:

    +380 44 123 45 67
    +380 44 123 45 67
    +350 56 145 45 57
    +330 76 125 55 57
    +380 44 3534 45 67
    +320 45 123 78 87
    +310 54 193 99 97
    adasd
    asdddddddddddd
    sssdad

3 个答案:

答案 0 :(得分:1)

这是一种方法:

$ cat ip.txt 
+380 44 123 45 67
+380 (44) 1234567
+350 (56) 1454557
+330 (76) 1255557
+380 44 3534 45 67
+320 (45) 1237887
+310 (54) 1939997
adasd
asdddddddddddd
sssdad

$ sed -E 's/^(\+[0-9]{3}) \(([0-9]{2})\) ([0-9]{3})([0-9]{2})([0-9]{2})$/\1 \2 \3 \4 \5/' ip.txt 
+380 44 123 45 67
+380 44 123 45 67
+350 56 145 45 57
+330 76 125 55 57
+380 44 3534 45 67
+320 45 123 78 87
+310 54 193 99 97
adasd
asdddddddddddd
sssdad
  • ()可用于包围模式,以便在替换部分中对其中的匹配文本进行反向引用
  • \1对应于第一个此类捕获组,\2对应第二个等等
  • 要与()匹配,我们需要像\(\)
  • 一样使用它们
  • 因此,此处根据所需输出捕获数字,不包括输入行中存在的(),以便它们不是输出的一部分

答案 1 :(得分:0)

您的sed命令错误。 我的方式:

sed -E 's/^\+[0-9]{3} \([0-9]{2}\) [0-9]{7}$/[()]/'

答案 2 :(得分:0)

使用:

sed -e 's|[()]||g' so-tel.txt | sed -E 's|([0-9]{3})([0-9]{2})([0-9]{2})|\1 \2 \3|'

转换so-tel.txt

+380 44 123 45 67
+380 (44) 1234567
+350 (56) 1454557
+330 (76) 1255557
+380 44 3534 45 67
+320 (45) 1237887
+310 (54) 1939997
adasd
asdddddddddddd
sssdad

成:

+380 44 123 45 67
+380 44 123 45 67
+350 56 145 45 57
+330 76 125 55 57
+380 44 3534 45 67
+320 45 123 78 87
+310 54 193 99 97
adasd
asdddddddddddd
sssdad

<强>解释

's|[()]||g'

全部替换任何(),全球

's|([0-9]{3})([0-9]{2})([0-9]{2})|\1 \2 \3|'

替换并捕获长度为3,2和2的七个连续数字,捕获的数字组用空格分隔。