嘿,尽管我进行了研究,但我一直在努力破译特定的 sed 命令会做什么,但我似乎被难住了。
sed -E 's/([0-9]+)-([0-9]+)/\2:\1/g'
答案1
您的sed
表达式是一个替换,它将破折号周围的每对不重叠的正整数交换,并用冒号替换破折号。
你的表情会转变
000-212 444-818
进入
212:000 818:444
这些(...)
位是“捕获组”。这样的组捕获与其内的表达式匹配的子字符串。然后,该子字符串可\1
用于第一组、\2
第二组等。
您的捕获组都使用[0-9]+
,这是一种匹配 0 到 9 之间的非空数字序列的模式,例如字符串123000
。
-
两组之间的 会与数据中的文字破折号匹配。
替换字符串使用组匹配的数字,但以与匹配方式相反的顺序使用它们,并交换它们。替换文本还会:
在-
数字之间插入。
最后/g
,重复sed
替换数据中所有不重叠的匹配项。
使实用程序使用的非标准-E
选项sed
扩展正则表达式 (ERE) 而不是基本正则表达式 (BRE),后者是sed
.在 ERE 中,捕获组写作(...)
,而 BRE 使用\(...\)
。 BRE 也不必+
指定表达式的非空匹配序列,而是可以使用\{1,\}
。
因此,您的命令也可以写成可移植的
sed 's/\([0-9]\{1,\}\)-\([0-9]\{1,\}\)/\2:\1/g'
或作为
sed 's/\([0-9][0-9]*\)-\([0-9][0-9]*\)/\2:\1/g'