在使用 sed 讀取和搜尋檔案 word 並註解包含 word 的行然後儲存時,是否可以從檔案中刪除像 \ 這樣的特殊符號,但 \ 將就位?
我的意思是我有一個包含公司名稱(2 個單字)的文件,它們之間可以有一些字符,並且在原始文件中對這些符號使用字符轉義(正則表達式)。例如
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
我用 \ 替換任何內容並發表評論,但我也想像以前一樣用 \ 保存。我想要的輸出:
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
我的腳本是:
sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt
但它保存時沒有 \.是的,我知道我可以,不刪除,只搜尋“Red\\\\ Park”。但是,如果我有20 個名稱,我不想為每個由2-3 個單字組成的公司名稱鍵入\\\\ :) 或者您可能有另一個願景,使用另一個命令(而不是sed)來完成此操作?我願意接受每一個建議或幫助 我有可能得到我想要的嗎?太感謝了!
答案1
如果我理解正確,讓我們看看這是否適合您:
sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file
輸出:
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
答案2
都說堅持是一種美德.....
我假設所有 2 個名稱公司均由\\
和 1 個字元分隔,並且國家/地區始終為大寫字母,所有公司至少包含一個小寫字母,即公司不能是國家/地區的子字串。
解決awk
方案(如果您支援該-i inplace
選項);我相信大多數人都會
awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
OFS="\\"}
$1~country && NR>1?$(NR-2)$NR:$1~company{
printf "#"}
NF>1{$NF=" "substr($NF,2)
};1' file1
Output
#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"
演練
告訴awk
進行更改-i inplace
並將您的國家/地區和公司作為變數傳遞-v
。由於您\\
的文件中後面有一個未知的分隔符,因此請.
在公司名稱的兩個部分之間使用
awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{
將字段分隔符號設為中斷,\
這將為您提供\\
出現的 3 個字段,然後設定
OFS="\\"}
如果出現中斷,則在列印時將它們放回原處。
如果第一個欄位$1==country
是比賽的第一部分。
對於公司,檢查您是否拆分\
並最終獲得多個字段NR>1
,然後根據情況對最後 2 個字段或未拆分字段進行測試。
如果我們有匹配項printf #
(即列印時不帶換行符)
$1~country && NR>1?$(NR-2)$NR:$1~company{
printf "#"}
如果您有多個字段,NF>1
那麼您會在公司名稱之間進行拆分,並希望在列印時\\?
確保該字段是空格,因此請刪除最後一個字段的第一個字元並將其替換為空格?
NF>1{$NF=" "substr($NF,2)
並列印
;1' file1