首页 > 解决方案 > 交换以特定字符开头的同一行中的两个字符串

问题描述

我正在处理一个包含多行的文件,我需要在其中交换一些字符串块。

假设我有这种结构:

# some comment
here is some text
f  483/1318/1298 484/1319/1299 485/1320/1300
f  486/1321/1301 485/1320/1300 484/1319/1299
f  64//59 67//62 76//71
v 1 2 3

我只想交换以f字符开头的行的最后两个字符串块(请注意,在 f 之后有 2 个空格)。

所以我想得到的结果是:

# some comment
here is some text
f  483/1318/1298 485/1320/1300 484/1319/1299
f  486/1321/1301 484/1319/1299 485/1320/1300
f  64//59 76//71 67//62 
v 1 2 3

我应该使用什么 sed 命令(或任何其他命令)?

标签: bashmacosawksed

解决方案


awk可以很简单地做到这一点 -awk '$0~/^f/ {x=$4;$4=$3;$3=x;} 1' file

$0 ~ /^f/仅对以 . 开头的行执行以下块f。$0 完全是当前行。

{x=$4;$4=$3;$3=x;}仅对匹配的行执行并将第 4 个字段(由空格分隔)存储在变量中,然后将其设置为第 3 个字段,然后将第 3 个字段设置为变量。

1让 awk 打印所有行,因为 awk 的默认行为是print,并且是真实的。

$ cat file
# some comment
here is some text
f  483/1318/1298 484/1319/1299 485/1320/1300
f  486/1321/1301 485/1320/1300 484/1319/1299
f  64//59 67//62 76//71
v 1 2 3

$ awk '$0~/^f/ {x=$4;$4=$3;$3=x;} 1' file
# some comment
here is some text
f 483/1318/1298 485/1320/1300 484/1319/1299
f 486/1321/1301 484/1319/1299 485/1320/1300
f 64//59 76//71 67//62
v 1 2 3

推荐阅读