簡體   English   中英

如何寫入 bash 中的前 n 行文件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM