将特定行从一个位置移动到另一个位置

For*_*ekk 4 command-line bash sed tail head

我正在使用 ubuntu 终端,我需要将文件中的特定行(第 11 位)移动到第一行,然后将最终结果传输到新文件中。原始文件包含数百行。
到目前为止,我尝试使用 sed 命令工具,但没有达到我想要的效果。这是我到目前为止得到的:

[mission 09] $ sed -n -e '1p' -e '11p' bonjour > bonjour2
Run Code Online (Sandbox Code Playgroud)

但它只显示新文件的第一行和第 11 行。但我希望新文件具有与其余原始行一起所需的修订位置。

输入 :

English: Hello 
Turkish: Marhaba 
Italian: Ciao 
German: Hallo 
Spanish: Hola 
Latin: Salve 
Greek: chai-ray 
Welsh: Helo 
Finnish: Hei 
Breton: Demat 
French: Bonjour 
Run Code Online (Sandbox Code Playgroud)

期望输出

French: Bonjour 
English: Hello 
Turkish: Marhaba 
Italian: Ciao 
German: Hallo 
Spanish: Hola 
Latin: Salve 
Greek: chai-ray 
Welsh: Helo 
Finnish: Hei 
Breton: Demat 
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Kus*_*nda 9

使用edsedgrep派生自的行编辑器):

printf '%s\n' '11m0' 'w bonjour2' 'q' | ed -s bonjour
Run Code Online (Sandbox Code Playgroud)

这将编辑命令应用于11m0将第 11 行移动到第一行之前的文件。然后它将生成的文档写入文件bonjour2并退出。

或者:

printf '%s\n' '11m0' ',p' 'Q' | ed -s bonjour >bonjour2
Run Code Online (Sandbox Code Playgroud)

...而不是使用ed命令写入特定文件,而是将整个文件打印到标准输出。然后将结果重定向到新文件名。该,p命令( 的缩写1,$p)会将整个文档输出到标准输出并Q强制退出(即使文档已更改)。

要就地更改文档(即更改原始文件),请将结果写回文件本身:

printf '%s\n' '11m0' 'wq' | ed -s bonjour
Run Code Online (Sandbox Code Playgroud)

上述变体之一的示例运行:

printf '%s\n' '11m0' 'w bonjour2' 'q' | ed -s bonjour
Run Code Online (Sandbox Code Playgroud)

要始终将最后一行移到顶部,请使用$m0代替11m0。要始终移动以字符串开头的行French:,请使用/^French:/m0.

  • @ForzaTekk `printf` 根据第一个参数中的格式打印从第二个参数开始的所有参数。格式字符串“%s\n”指定每个字符串应打印为字符串(duh),后面带有换行符。“ed”编辑器从标准输入读取编辑命令,并期望这些命令位于单独的行上,这就是原因。单独运行“printf”命令(直到但不包括“|”)以查看传递给“ed”的内容。还可以尝试 `printf 'name: %s\n' *` (不带 `ed` 位,作为教育练习)。 (2认同)