我有一项任务,编辑一个名为的文本文件LOLOLOL
。
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY bob bob bob Gary gary
the the bird in the the bush!
LOL MATE!
我有一个名为的 bash 脚本文件lolz.script
:
#!/bin/bash
sed '1i Hee hee hee\n Ho Ho Ho\n' $1
sed 's/bob/Bob/g' $1
.\lolz.script LOLOLOL
在命令行运行,我得到了LOLOLOL
文本的多次迭代 - 准确地说,每个 sed 命令一次迭代。
例如,输出显示此处的第一个和第二个 sed 命令(分别应用):
*Hee Hee Hee
Ho Ho Ho*
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY bob bob bob Gary gary
the the bird in the the bush!
LOL MATE!
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY *Bob Bob Bob* Gary gary
the the bird in the the bush!
LOL MATE!
- --- * 在输出中显示文本文件中更改的部分。
而我想要的输出是:
*Hee Hee Hee
Ho Ho Ho*
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY Bob Bob Bob Gary gary
the the bird in the the bush!
LOL MATE!
如你所见,每个 sed 命令都应用了独立在每次打印文本文件时。我需要应用所有 sed 命令一起。
请注意,第一个 sed 命令所需的标题是如何在第一次迭代中应用的,而在第二次迭代中却没有应用(但bob
要Bob
更改的内容是应用的)。
为什么会发生这种情况?我该怎么做才能使脚本中的命令累积到一个文本文件中?这似乎没有发生在相同格式的awk
脚本中。
答案1
简单来说:您调用了sed
两次。
如果你在终端中依次运行这些命令,你将得到两组输出。你的脚本只是在自己的 shell 中执行相同的操作。
您可以使用{}
对命令进行分组,并将每个命令放在新行上,或者使用;
以便所有命令累积地作用于文件,仅调用 sed 一次:
#!/bin/bash
sed '{
1i Hee hee hee\n Ho Ho Ho\n
s/bob/Bob/g
}' "$1"
输出./script file
Hee hee hee
Ho Ho Ho
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY Bob Bob Bob Gary gary
the the bird in the the bush!
LOL MATE!