簡體   English   中英

使用sed或awk替換參數值

[英]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然后更改subgsub 另外,如果要將輸出保存到相同的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完成通用解決方案:

  1. =周圍的空格始終可以刪除
  2. 我們將在左側搜索完全匹配
  3. 鍵值包含一個不帶引號的單詞

這樣,我們可以創建一個小的外殼包裝器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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM