![sed:剪切 X 行并附加到文件顶部](https://linux22.com/image/77943/sed%EF%BC%9A%E5%89%AA%E5%88%87%20X%20%E8%A1%8C%E5%B9%B6%E9%99%84%E5%8A%A0%E5%88%B0%E6%96%87%E4%BB%B6%E9%A1%B6%E9%83%A8.png)
我希望能够剪切 X 线并将 X 线插入位置 y(顶部)。这将帮助我重新组织一些配置文件。
Text example line number 1 <--- Append line 10 above line 1
Text example line number 2
Text example line number 3
Text example line number 4
Text example line number 5
Text example line number 6
Text example line number 7
Text example line number 8
Text example line number 9
Text example line number 10 <--- Cut or hold in buffer
Text example line number 11
Text example line number 12
Text example line number 13
到目前为止我唯一发现的是:
# Cuts line 10 and adds it to the end of file
sed -n -e '10h;10!p;${g;p;}' file-01.txt
但我不知道如何将保留内容放在最后一行之外的另一行上。
不幸的是我对 sed 不太熟悉。 stackoverflow 和这里也有类似的问题,但我无法修改它们以满足我的需求。
我更喜欢使用 sed 的解决方案,但如果使用 awk 等其他工具可以更轻松地实现此解决方案,那么也欢迎使用此解决方案。
答案1
使用 sed
让我们创建一个测试文件:
$ seq 10 >file
要将第 5 行移至文件顶部:
$ sed '1,4{H;1h;d}; 5{p;x}' file
5
1
2
3
4
6
7
8
9
10
怎么运行的
1,4{H;1h;d}
这可以节省保留空间中的第 1 行到第 4 行。
更详细地说,
H
在将换行符附加到保留空间后,将当前行附加到保留空间。对于第 1 行,我们不需要换行符,因此我们发出命令1h
将第 1 行发送到不带换行符的保留空间。该d
命令从模式空间中删除当前行,以便它不会被打印。5{p;x}
这将打印第 5 行,然后打印保留空间。
p
告诉 sed 打印模式空间(包含第 5 行)。x
告诉 sed put 交换模式和保留空间,以便现在打印保留空间中的内容。
第 5 行之后的行保持不变。
使用 awk
$ awk 'NR<5{s=s ORS $0;next} NR==5{print $0 s;next} 1' file
5
1
2
3
4
6
7
8
9
10
这里的逻辑与 sed 的逻辑非常相似。我们将第 5 行之前的所有行保存在变量中s
。当我们到达第 5 行时,我们打印它,然后打印 s。其余线路保持不变。