[英]How to write to first n lines of file in bash
我有一个包含以下内容的文件test.txt
first
second
AAA
BBB
CCC
DDD
我想删除前两行并在前两行添加新值,
所以,
删除前两行后,文件应如下所示:
AAA
BBB
CCC
DDD
然后应该将这两个值添加到第一行,然后是第二行,因此文件最终如下所示:
new value at line 1
new value at line 2
AAA
BBB
CCC
DDD
所以我尝试了以下命令,但是如何删除前两行?
SERVER_HOSTNAME=$(hostname)
SERVER_IP=$(ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p')
sed -i "1s/.*/$SERVER_HOSTNAME/" /tmp/test.txt
sed -i "2s/.*/$SERVER_IP/" /tmp/test.txt
我的问题是,当我首先删除前两行并执行上述命令时,它将用新值替换第 1 行和第 2 行,但我想将它们添加到顶部以便其他(已经存在的内容会移动下)将 go 下。
您能否尝试使用 GNU awk
中的示例进行跟踪、编写和测试。 这将使用 shell 变量值编辑第一行和第二行,并将就地保存到 Input_file 本身。
如果您想保留第一行的内容并打印当前内容,则可以在FNR==2
或FNR==1
条件下删除next
。
SERVER_HOSTNAME=$(hostname)
SERVER_IP=$(ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p')
awk -v server_ip="$SERVER_IP" -v server_hostname="$SERVER_HOSTNAME" '
FNR==1{ print server_hostname; next}
FNR==2{ print server_ip; ; next}
1
' Input_file > temp && mv temp Input_file
上述解决方案的说明:
awk -v server_ip="$SERVER_IP" -v server_hostname="$SERVER_HOSTNAME" '
##Starting awk program from here, creating server_ip and server_hostname vars with respective shell vars.
FNR==1{ print server_hostname; next}
##Checking condition if this is 1st line then print server_hostname.
FNR==2{ print server_ip; ; next}
##Checking condition if this is 2nd line then print server_ip here.
1
##1 will print current line.
' Input_file
##Mentioning Input_file name here.
不要重复运行sed -i
。 相反,将所有命令组合到一个脚本中。
sed -i "1s/.*/$(hostname)/
2s/.*/$(ip -o route get to 8.8.8.8)/
2s/.*src \([0-9.]\+\).*/\1/" /tmp/test.txt
不过,这相当脆弱。 特别是,如果任一命令替换在其 output 中产生斜线,它将中断。
(IIRC ip
具有生成机器可读 output 的选项;您可能应该研究一下,而不是更换您不想要的部件。)
如果要添加然后删除sed
d
和命令,则分别执行a
操作。 但是去掉二加二显然就等于换了二。
sed -i "1d
1a\hello
2d
2a\hello" file
不幸的是, a
命令的标准化很差,并且不清楚两个s
命令如何不起作用,所以我将其保留为草图。
您现有的sed
已经可以满足您的需求; 它不需要您自己先删除前两行。
$ cat tmp.txt
first
second
AAA
BBB
CCC
DDD
$ SERVER_HOSTNAME=example.local
$ SERVER_IP=127.0.0.1
$ sed -i "1s/.*/$SERVER_HOSTNAME/;2s/.*/$SERVER_IP/" tmp.txt
$ cat tmp.txt
example.local
127.0.0.1
AAA
BBB
CCC
DDD
您可以使用这个gnu sed
:
gsed -i -e "1i\\$SERVER_HOSTNAME\n$SERVER_IP" -e '1,2{d;q;}' /tmp/test.txt
或使用 POSIX sed:
sed -i.bak "1,2{d;q;};3i\\
$SERVER_HOSTNAME
3i\\
$SERVER_IP
" /tmp/test.txt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.