sed 反向引用

sed 反向引用

我有以下几行存储在文本文件中电话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$

相关内容