簡體   English   中英

在 LINUX/BASH 中在另一個文件的特定行號插入文件內容

[英]Insert content of file at specific line number of another file in LINUX/BASH


我有以下兩個文件 - 'tempFile' 和 'File1'

臨時文件

tempFile 01
tempFile 02
tempFile 03
tempFile 03

文件 1

File1
 @type ABCDF #---Insert 'tempfile' content below First occurrence '@type ABCDF'
File2
File3
 @type ABCDF
File4
 @type ABCDF
File5

我嘗試使用以下腳本在第一次出現語句“@type ABCD”時將“tempFile”的內容插入到另一個文件“File1”中

lineNumber=$(grep -n -m 1 '@type ABCD' File1 | awk -F':'  '{print $1}' | head -1)
sed -i "${lineNumber}r tempFile" File1

但是,上面的腳本在 File1 中多次插入 tempFile 的內容,如下所述請幫我在 File1 中插入 tempFile 的內容一次/腳本生成以下輸出

File1
 @type ABCDF #---Insert 'tempfile' content below First occurrence '@type ABCDF'
 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03

 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03

 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03

 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03

 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03

 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03
File2
File3
 @type ABCDF
File4
 @type ABCDF
File5

腳本的預期輸出

File1
 @type ABCDF #---Insert 'tempfile' content below First occurrence '@type ABCDF'
 tempFile 01
 tempFile 02
 tempFile 03
 tempFile 03
File2
File3
 @type ABCDF
File4
 @type ABCDF
File5

這對我有用:

touch result                                                          #Intermediate file
lineNumber=$(grep -n -m 1 '@type ABCD' File1 | awk -F':'  '{print $1}' | head -1)
head -n $lineNumber File1 >> result                                   #First two lines
cat tempfile >> result                                                #Append your tempfile
sed -n "3,`wc -l File1 | awk ' { print $1}'`p" File1 >> result        #Rest of File1
mv result File1                                                       #Rename it to File1

您可以使用awk相當輕松地使用變量作為標志,以便在第一次出現"@type ABCDF"后僅寫入一次tempfile的內容。 方法很簡單,你用第一個{print}規則輸出每一行,然后如果/@type ABCDF/ && n ,你用getlinetempfile讀取每一行並輸出它。 完成輸出文件后,您只需設置n=0 ,它將跳過文件中所有其他出現的"@type ABCDF" ,例如

awk -vn=1 '{print}; /@type ABCDF/ && n{while (getline <"tempfile") print;n=0}' file1 

示例 輸入文件 1

$ cat file1
File1
 @type ABCDF #---Insert 'tempfile' content below First occurrence '@type ABCDF'
File2
File3
 @type ABCDF
File4
 @type ABCDF
File5

示例使用/輸出

$ awk -vn=1 '{print}; /@type ABCDF/ && n{while (getline <"tempfile") print;n=0}' file1
File1
 @type ABCDF #---Insert 'tempfile' content below First occurrence '@type ABCDF'
tempFile 01
tempFile 02
tempFile 03
tempFile 03
File2
File3
 @type ABCDF
File4
 @type ABCDF
File5

您可以將輸出重定向到臨時文件,然后替換原始文件以模擬行的就地添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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