我有一個兩行的“ keyword = keyvalue ”行模式(選擇性地從systemd/networkd.conf檔案中洗掉):
DNS=0.0.0.0
DNS=
并需要以下兩行答案:
0.0.0.0
但是,如果最后一行模式匹配導致空匹配,則所有使用sedor的嘗試都會導致省略換行符。awk
編輯:哦,最后一件事,這個多行跟隨剪切結果也必須存盤回一個包含相同“最后一個空白行”的 bash 變數中,所以這是保留最后一個空白的兩步操作-線
- 多行在等號之前(或在之后保存內容)預先剪切,
=同時保留換行符......以防空結果(這是這里的關鍵)。或者可能會在最后一行出現空匹配結果的情況下使用一個弱修復來附加一個新行。 - 將多行結果保存回 bash 變數
sed方法
在 bash shell 中執行剪切并包含該匹配字符時,sed將洗掉任何具有空模式匹配的空行:
raw="DNS=0.0.0.0
DNS=
"
rawp="$(printf "%s\n" "$raw")"
kvs="$(echo "$rawp"| sed -e '/^[^=]*=/s///')"
echo "result: '${kvs}'"
給出結果:
0.0.0.0
沒有相應的空行。
awk方法
awk 也有同樣的問題:
raw="DNS=0.0.0.0
DNS=
"
rawp="$(printf "%s\n" "$raw")"
kvs="$(echo "$rawp"| awk -F '=' -v OFS="" '{$1=""; print}')"
echo "result: '${kvs}'"
給出相同的答案(它洗掉了空行)。
請指教
不知何故,我需要以下答案:
0.0.0.0
以包含0.0.0.0一個空行的兩行輸出的形式。
其他意見
我還注意到,如果我提供如下 3 行資料(兩個帶有鍵值,中間一個沒有鍵值:
DNS=0.0.0.0
DNS=
DNS=999.999.999.999
兩者都sed提供awk了正確的答案:
0.0.0.0
999.999.999.999
很奇怪,嗯?
上述正則運算式(sed和awk)適用于:
- 帶有其鍵值的單行,
- 任何行只要任何行都有其非空鍵值,但
- 最后一行必須有一個鍵值。
當最后一行有一個空鍵值時不起作用。
:-/
uj5u.com熱心網友回復:
你可以使用這個awk:
raw="DNS=0.0.0.0
DNS=
"
awk -F= 'NF == 2 {print $2}' <<< "$raw"
0.0.0.0
以下cut也應該作業:
cut -d= -f2 <<< "${raw%$'\n'}"
0.0.0.0
要存盤包含尾隨換行符的輸出,請使用read行程替換:
IFS= read -rd '' kvs < <(awk -F= 'NF == 2 {print $2}' <<< "$raw")
declare -p kvs
declare -- s="0.0.0.0
"
代碼演示:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439451.html
上一篇:通過變數列印到標準輸出
下一篇:如何符號鏈接別名和函式點檔案
