bash - 交换以特定字符开头的同一行中的两个字符串
问题描述
我正在处理一个包含多行的文件,我需要在其中交换一些字符串块。
假设我有这种结构:
# 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 命令(或任何其他命令)?
解决方案
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
推荐阅读
- python - 从循环中的数据创建列表
- amazon-web-services - 从 AWS CDK 创建具有自定义域名的 Cognito 用户池
- angular - 如何在Angular4中动态使用eval创建新组件
- android - DioError [DioErrorType.RESPONSE]:Http 状态错误 [400] 异常
- r - 如何使用 rmarkdown 使绘图图表适应页面宽度?
- generics - Reactor Kotlin 通用类型返回
- matlab - 解决 SIMULINK 模型中的代数环面临的挑战
- django - Python Django:JSONDecodeError 当我尝试从 api 检索数据时
- python - 给定一个列表,你如何找到相同值在不同列表中的索引位置?
- html - 我想在一个展开时关闭其他打开的面板,而其他部分将被关闭