我有一个文件,我必须按特定模式(电话号码)查找和更改字符串。正则表达式是:
^\+[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
答案 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的七个连续数字,捕获的数字组用空格分隔。