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)
有什么建议吗?
使用ed
(sed
和grep
派生自的行编辑器):
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
.