Awk
匹配一個模式並替換它後面的第一個字元串實例(不管空格或製表符)
不久前我問了一個類似的問題,但我正在碰一堵磚牆讓這個問題起作用。
我正在編寫一個配置文件的修改腳本,如下所示:
[Thing1] [[subthingA]] this = 0 that = string and = localhost the = 80 other = 0 thing_ading = /path/to/a/dir [Thing2] [[subthingB]] this = 0 thing_ading = /path/to/dir here = 0
其中有N個
$$ Things $$,通常與鍵/值對的相同鍵和/或值,以及下的鍵/值對$$ [subthings $$] 正好縮進 8 個空格。我特別嘗試使用 awk/sed/grep/tr/cut/perl 製作一個單線,可以將
thing_ading
under的值更改SubthingB
為不同的目錄路徑。 我可以編輯所有thing_adings
內容,並且可以定位某些對,但是這些空間確實給我帶來了問題。
sed
您可以使用範圍運算符解決此類問題,
:sed -e ' /^\[Thing2]$/,/^$/!b /^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*|\1 = /YOUR/NEW/PATH/TO/DIR| ' yourinifile
- 首先,您通過跳過不正確的範圍來選擇正確的範圍。
- 然後,當在適當的範圍內時,您對所需的 thing_ding 變數執行替換。
這是一個
sed
單行:sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file
為了只在塊上工作,我們從縮進之後開始
subthingB
處理從下一行到下一行的所有內容。[[subthingB]]``[
現在,對於這個塊,我們定址該
thing_ading
行並進行替換,使用命令_
而不是/
分隔符s
來避免將替換反斜杠導致不可讀。如果
subthingB
保證該塊有一個thing_ading
條目,則可以簡化為sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'
重用最後一個模式進行內部定址。