[英]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.