Text-Processing
在 bash 腳本終端中查找和替換文本
我有一個文件
/home/count/1/details/info.txt
如下title1 { key1 value1 key2 value2 key3 value3 } info { name1 text post1 anything salary 1 work day1 work day2 work day3 } work { department sell store ground remarks } contact { required No }
現在我需要更改為:
title1 { key1 value1 key2 value2 key3 value3 } info { name1 text post1 anything salary 1 work day1 work day2 work day3 work day4 work day5 work day8 } work { department sell store ground remarks Absent No } contact { required No }
資訊組添加了 3 個新值
work day4
,work day5
,work day8
. 工作組獲得了新的價值,即Absent
.標題 ie, title1, info, work 是固定的,不能更改。但 {} 之間的值是動態變化的,可以是任何值。但是關鍵工作是固定的,只能添加或刪除,不能重命名。
我必須編寫 bash 文件來完成此操作。我只能使用帶有 ubuntu 20.04 server minimum 的終端。
任何想法,建議,幫助?
謝謝
與
perl
:perl -0777 -pi -e ' s{^info\s*\{.*?\K(?=\})}{join "", map {"work day$_\n"} 4,5,8}mse; s{^work\s*\{.*?\K(?=\})}{Absent No\n}ms' /home/count/1/details/info.txt
awk 'BEGIN {RS=ORS="\n\n"}; /^info {/ { gsub("}","work day4\nwork day5\nwork day8\n}") }; /^work {/ { gsub("}","Absent No\n}") }; 1' info.txt
這告訴 awk 一次讀取輸入文件一個段落(即記錄由兩個換行符分隔,而不僅僅是一個,通過將輸入記錄分隔符設置
RS
為\n\n
)。它還將輸出記錄分隔符設置為與 相同RS
,以便輸出在記錄之間也有一個空行。然後它使用該函式在每個匹配段落的末尾(以“info {”或“work {”開頭
gsub()
)的末尾添加額外的行。}
實際上,它用額外的行替換了這些記錄的}
末尾和}
- 這實際上與插入額外的行相同。final
1
是 awk 的簡寫