Text-Processing

在 bash 腳本終端中查找和替換文本

  • April 12, 2021

我有一個文件/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())的末尾添加額外的行。}實際上,它用額外的行替換了這些記錄的}末尾}- 這實際上與插入額外的行相同。

final1是 awk 的簡寫print,列印每條記錄,無論它是否已被修改。

引用自:https://unix.stackexchange.com/questions/644534