[英]Replace parameter value using sed or awk
我有一些示例配置文件
A_place = 10km
B_place=5km
#A_place=2km
C_place=1km
我想更改未注釋行中的A_place值。 有些行可能有初始空格。 我嘗試了一個基本的sed
命令來查找和替換它,但是它不起作用。 也許我應該使用AWK
而不是流編輯器?
使用sed:
sed -e '/#/!s/\\(A_place[[:space:]]*=[[:space:]]*\\)\\(.*\\)/\\1"new_value"/' input
在這里做的細目:
跳過注釋行:
/#/!
然后以形式出現替換
s /舊/新/
選擇舊的字符串,然后將原始字符串放在parens中(反向引用),以便以后可以通過指定\\ 1來保留它。 這與字符串“ A_place”相匹配,后跟零個或多個空格字符,后跟等號,后跟零個多個空格字符。 注意,要替換的值也在parens中,並且可以由\\ 2引用; 這里不需要它,可以省略括號。 因此要匹配的舊字符串是:
( A_place [[:space:]] * = [[:: space:]] * ) (。*)
然后,使用“ \\ 1”后向引用創建要輸出的新行,保留等號周圍的空格並附加“新值”,為清晰起見,此處用引號顯示,這是新行中的文字,但可能不需要在最終輸出中。 “ \\ 1”是第一個用括號分隔的正則表達式中匹配的所有內容,包括等號周圍的任何空格:
\\ 1“ new_value”
跟隨awk
可能會幫助您。
awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file
或者,如果OP想要更改A_place
字符串的最后一列值,則使用:
awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file
如果你有超過1次出現串A_place
然后更改sub
到gsub
。 另外,如果要將輸出保存到相同的Input_file中,則也可以使用以下代碼。
awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file > temp_file && mv temp_file Input_file
要么
awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file > temp_file && mv temp_file Input_file
以下sed表達式會將A_place
的新距離設置為32km。 保留直到新距離的所有內容的空間:
> cat kk.config
A_place = 10km
B_place=5km
#A_place=2km
C_place=1km
> sed -i -e 's/^\( *A_place *= *\).*/\132km/' kk.config
> cat kk.config
A_place = 32km
B_place=5km
#A_place=2km
C_place=1km
正則表達式的問題之一是味道太多。 顯然,sed使用基本的正則表達式,如果要對內容進行分組以供以后使用,則必須在括號中加反斜杠。 插入符號將從行的開頭開始匹配,因此將忽略注釋中的匹配。
當我們假設以下awk
時,可以使用awk
完成通用解決方案:
=
周圍的空格始終可以刪除 這樣,我們可以創建一個小的外殼包裝器run.sh
,其鍵和值作為參數:
key=$1
value=$2
awk -F '[ =]*' \
-v key=$key \
-v value=$value \
'/^#/ { print; next }
$1 == key { $2 = value }
{ print $1 "=" $2 }' sample.txt
示例運行:
$ sh run.sh A_place 20km
A_place=20km
B_place=5km
#A_place=2km
C_place=1km
簡單的sed
解決方案:
val="2km"
sed "/^[[:blank:]]*A_place[[:blank:]]*=/s/=.*/= ${val}/" file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.