Bash脚本向文件的第一行追加文本

9

我希望使用一个Bash脚本在文件的第一行末尾添加文本。该文件是/etc/cmdline.txt,不允许换行,需要用空格隔开新命令,因此我想要添加的文本真正需要在第一行。

目前为止,我得到的代码如下:

line=' bcm2708.w1_gpio_pin=20'
file=/boot/cmdline.txt
if ! grep -q -x -F -e "$line" <"$file"; then
  printf '%s' "$line\n" >>"$file"
fi

但是这样添加文本会在第一行的换行符后面,所以结果是错误的。我需要修剪文件内容,添加我的文本和一个换行符,或者以某种方式将其添加到文件的第一行而不触及其余部分,但是我的bash脚本知识不足以找到解决方案,而且我在网上找到的所有示例都是在文件的每一行开头/结尾添加,而不仅仅是第一行。


1
使用 grep "$line" "$file" 替代,@RyuKajiya 我刚试过了,在我的终端上运行良好。 - Arnab Nandy
1
谢谢!现在运行得非常好。 - Ryu Kajiya
4个回答

24

这个 sed 命令会将 123 添加到您的文件第一行的末尾。

sed ' 1 s/.*/&123/' yourfile.txt

同样

sed '1 s/$/ 123/' yourfile.txt

如果要将结果添加到同一文件中,您需要使用-i开关:

sed -i ' 1 s/.*/&123/' yourfile.txt

3
sed '1 s/$/ 123/' 怎么样?=) - Gilles Quénot
sed ' 1 s/.*/&bcm2708.w1_gpio_pin=20/' "$file" > "$file" 这条命令清空了整个文件... - Ryu Kajiya
请再次检查 @RyuKajiya,已根据您的要求更新了命令。 - Arnab Nandy
在运行此命令之前,请使用 grep 检查添加的字符串,如果找到,则忽略执行。@RyuKajiya - Arnab Nandy
这就是我已经在做的,检查上面的代码。但似乎检查失败了。 - Ryu Kajiya
显示剩余2条评论

4

这是一个在/etc/passwd的第一行添加"ok"的解决方案,我认为你可以在你的脚本中使用这个方案并进行一些微调:

$ awk 'NR==1{printf "%s %s\n", $0, "ok"}' /etc/passwd
root:x:0:0:root:/root:/bin/bash ok

所以我会执行 printf awk 'NR==1{printf "%s %s\n", $0, "bcm2708.w1_gpio_pin=20"}' /boot/cmdline.txt >> "$file" ? - Ryu Kajiya
你真的需要在这里使用 sudo 吗?我怀疑不需要!至于其他部分,看起来很好! - Gilles Quénot
无法工作,我已将printf行编辑为上面评论中的行,但文件未被修改。 - Ryu Kajiya
1
awk 不支持直接在原文件上进行 in-place 修改,你需要使用一个临时文件或者使用 sed -i ... - Gilles Quénot
这会更新第一行,但会删除其他所有行。 - Joey Adams

2

要编辑文件,您可以使用标准编辑器ed

line=' bcm2708.w1_gpio_pin=20'
file=/boot/cmdline.txt
if ! grep -q -x -F -e "$line" <"$file"; then
    ed -s "$file" < <(printf '%s\n' 1 a "$line" . 1,2j w q)
fi

ed 的命令:

  • 1: 跳转到第 1 行
  • a: 追加(将在当前行后插入)
  • 我们正在插入扩展的$line,并处于插入模式中
  • .: 退出插入模式
  • 1,2j:合并第 1 行和第 2 行
  • w: 写入
  • q: 退出

0

这可以用于将变量附加到输入的第一行:

awk -v suffix="$suffix" '{print NR==1 ? $0 suffix : $0}'

这将起作用,即使变量可能包含正则表达式格式字符。
示例:
suffix=' [first line]'
cat input.txt | awk -v suffix="$suffix" '{print NR==1 ? $0 suffix : $0}' > output.txt

input.txt:

Line 1
Line 2
Line 3

output.txt:

Line 1 [first line]
Line 2
Line 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接