Awk

匹配一個模式並替換它後面的第一個字元串實例(不管空格或製表符)

  • July 5, 2017

不久前我問了一個類似的問題,但我正在碰一堵磚牆讓這個問題起作用。

我正在編寫一個配置文件的修改腳本,如下所示:

[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_adingunder的值更改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/_}'

重用最後一個模式進行內部定址。

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