我有以下几行存储在文本文件中电话2:
Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava|926/448/829
Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava|926.443.602
我的意图是将电话号码作为每行的开头,所以我这样做了:
sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt
我仅将第一组作为输出,而忽略了第二个捕获组。但是,如果我在 \2 和 \1 之间放置一个 \n,它会先输出第二组,然后在新行中输出第一组,因此它不是正则表达式。第一组会覆盖第二组吗?我是否遗漏了什么?
提前致谢!
答案1
根据评论,问题在于您的文件具有 DOS 样式的 CRLF 行尾,并且您的第二个捕获组正在捕获 CR 并将其移动到输出模式的中间,如您所见,使用它cat -et
使行尾明确:
$ sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt | cat -et
|926/448/829^MHernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava$
|926.443.602^MGomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava$
一个可能的解决方案是将 CR 排除在第二组之外:
$ sed 's/\(.*13...|[^|]*\)\(.*\)\r$/\2\1\r/' tel2.txt | cat -et
|926/448/829Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
|926.443.602Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$
(如果您不希望结果中出现 DOS 风格的结尾,请\r
在替换中省略)。
我怀疑你并不真的想要在前面的分隔符 - 更简单的表达式可以更合理地处理分隔符
sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/'
前任。:
$ sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/' tel2.txt | cat -et
926/448/829|Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
926.443.602|Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$