【发布时间】:2019-07-03 07:51:55
【问题描述】:
示例编号:
12345678
我的尝试:
sed 's/\(.\)\(.\)/\2\1/'
我的结果:
21345678
这里的这一行将交换数字的第一个位置和第二个位置。我似乎不知道如何处理进一步的职位。
【问题讨论】:
示例编号:
12345678
我的尝试:
sed 's/\(.\)\(.\)/\2\1/'
我的结果:
21345678
这里的这一行将交换数字的第一个位置和第二个位置。我似乎不知道如何处理进一步的职位。
【问题讨论】:
您可以将第 4 个字母和第 7 个字母交换为:
sed 's/\([0-9]\{3\}\)\([0-9]\)\([0-9]\{2\}\)\([0-9]\)/\1\4\3\2/' <<< "12345678"
输出:
12375648
【讨论】:
您只需对其进行修改以捕获更多组,并以所需的顺序输出它们:
sed 's/^(...)(.)(..)(.)/\1\4\3\2/'
# | | | | |
# | | | | +- digit #7(\4)
# | | | +----- 2 chars (\3)
# | | +-------- digit #4 (\2)
# | +------------ 3 chars (\1)
# +--------------- start-of-line anchor
请记住,这是最简单的情况,您只想交换字符位置,而不管它们是否为数字。您可以轻松地重新扩展字符类以限制交换的内容,但我在这里的目的只是展示实现交换的最简单方法。
【讨论】:
-E或-r。
使用awk 似乎更干净:
$ echo 12345678 | awk '{t=$4; $4=$7; $7=t}1' FS= OFS=
12375648
【讨论】:
这可能对你有用(GNU sed):
sed -E 's/./\n&/7;s//\n&/4;s/\n(.)(.*)\n(.)/\3\2\1/' file
在字符位置引入换行符并使用模式匹配来交换这些字符。
注意替换的正常流程必须颠倒,否则引入的换行符会影响原始字符串的长度。
【讨论】:
使用通过 -E 选项支持 ERE 的 sed,例如GNU sed 和 OSX/BSD sed:
$ echo '12345678' | sed -E 's/(.{3})(.)(.{2})(.)/\1\4\3\2/'
12375648
【讨论】: