sed:剪切 X 行并附加到文件顶部

sed:剪切 X 行并附加到文件顶部

我希望能够剪切 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。其余线路保持不变。

相关内容