匹配文件中的模式之間的行,並檢查匹配行中的單詞,如果未找到,則添加單詞

分享于 

4分钟阅读

ubuntu

  简体

問題:

我有一個大文件,內容如下:

--- fruits_file.txt---


fruit:



apple 


orange



fruit:



grapes


mango



fruit:



banana


cherries



--- fruits_file.txt---


fruit:



apple



orange



fruit:



grapes



mango



apple



fruit:



banana



cherries



apple



有沒有簡單的方法來實現這個?


答案1:

可以通過以下方式處理文件:

0.假定你的文件如下所示:


cat fruits_file.txt




fruit:



apple


orange



fruit:



grapes


mango



fruit:



banana


cherries



1.將文件的內容轉換為單行:


paste -s -d ' ' fruits_file.txt




fruit: apple orange fruit: grapes mango fruit: banana cherries



2.將上面的命令的輸出通過管道傳遞給sed,並在字元串fruit:之前放置新行,通過管道將輸出傳遞給|


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d'




fruit: apple orange


fruit: grapes mango


fruit: banana cherries



3.將上面的命令的輸出通過管道傳遞給awk,以便將apple附加到缺少該命令的行:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}'




fruit: apple orange


fruit: grapes mango


fruit: banana cherries



4.將上面的命令的輸出通過管道傳遞給sed,以便將(表達式1)多個空格替換為單個空格,而(表達式2)在每個空格後面追加


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /'




fruit: apple orange


fruit: grapes mango apple


fruit: banana cherries apple



5.再次將上面的命令的輸出通過管道傳遞給sed,以便用換行符替換,然後通過管道將輸出傳遞給head,以便刪除最後兩行空行:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' | 


 sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2




fruit:



apple


orange



fruit:



grapes


mango


apple



fruit:



banana


cherries


apple



6.重定向上述命令的輸出,並創建一個新文件:


paste -s -d ' ' fruits_file.txt | sed 's/fruit:/nfruit:/g' | sed '/^s*$/d' | 


 awk '{if (!/apple/) {printf "%s applen", $0;} else print}' | 


 sed -r -e 's/s{1,9}/ /g' -e 's/s*$/ /' | 


 sed -e 's/s/n/g' -e 's/fruit:/fruit:n/' | head -n -2 


 > fruits_new.txt



 
cat fruits_new.txt




fruit:



apple


orange



fruit:



grapes


mango


apple



fruit:



banana


cherries


apple





相关文章