我有一個檔案 file.yaml ,其中包含要替換的占位符:
class: ##TOPIC##-area
name: myClass
type: Class
secretKey: private-##SECRET_KEY##
到目前為止,我已經使用 grep 來獲取占位符的值
grep -P '(?<=##).*(?=##)' file.yaml
然后,我有這些價值觀:
TOPIC
SECRET_KEY
現在,我們必須引入每行可以有一個以上占位符的新屬性
class: ##TOPIC##-area
name: myClass
type: Class
secretKey: private-##SECRET_KEY##-encoded-##SUFFIX_CODE##
因此,grep 不再起作用,因為輸出變為:
TOPIC
SECRET_KEY##-encoded-##SUFFIX_CODE
但是,我想要
TOPIC
SECRET_KEY
SUFFIX_CODE
我接受各種建議和想法來解決這個問題。謝謝
編輯:這個想法是只獲取那些占位符,而不是替換它們。很抱歉對于這個誤會。
uj5u.com熱心網友回復:
第一個解決方案:使用 GNUawk,請嘗試以下awk代碼。簡單的解釋是,將 RS(記錄分隔符)設定為##直到下一次出現 ,#然后出現 2 次##。然后只需##根據顯示的輸出樣本洗掉結果中不需要的行,即可簡單地列印匹配的行。
awk -v RS='##[^#]*##' 'RT{print substr(RT,3,length(RT)-4)}' Input_file
第二種解決方案:使用 anyawk,請嘗試以下程式。簡單的解釋是,使用match函式awk匹配正則運算式/##[^#]*##/(在上面的第一個解決方案中已經解釋過);在 while 回圈中列印每行中找到的所有匹配項。
awk '{while(match($0,/##[^#]*##/)){print substr($0,RSTART 2,RLENGTH-4);$0=substr($0,RSTART RLENGTH)}}' Input_file
uj5u.com熱心網友回復:
如果Perl是您的選擇,請您嘗試:
perl -lne 'print $1 while /##(. ?)##/g' file.yaml
-l選項將換行符附加到print.-ne選項大多類似于sed.$1指的是正則運算式的捕獲組 1。- 該
while /pattern/g語法在同一行中啟用多個匹配項。
uj5u.com熱心網友回復:
當您想使用時grep,請嘗試類似
grep -Eo "##[^#]*##" file.yaml | tr -d '#'
有了awk多字符分隔符,看起來更容易:
awk -F'##' '{for (i=2; i<=NF;i =2) {print $i}}' file.yaml
uj5u.com熱心網友回復:
使用負前瞻##從匹配中排除包含在其中的子字串。
(?<=##)((?!##).)*(?=##)
演示
請注意,這也將回傳,-encoded-因為它也在一對##. 通常您不會得到重疊的匹配,但環視不被視為匹配的一部分,因此它們不算作重疊。
uj5u.com熱心網友回復:
如果 sed 是一個選項,您可以嘗試以下解決方案:
sed '/##.*##/!d
s/##/\
/
s/.*\n//
s/##/\
/
P;D' file
或者,一個簡單的bash解決方案:
#!/bin/bash
while read -r line; do
while [[ $line = *'##'*'##'* ]]; do
line=${line#*'##'}
printf '%s\n' "${line%%'##'*}"
line=${line#*'##'}
done
done < file
uj5u.com熱心網友回復:
將 GNUawk用于多字符 RS、RT:
awk -v RS='##[[:upper:]_] ##' 'RT{gsub(/##/,"",RT);print RT}' file
TOPIC
SECRET_KEY
SUFFIX_CODE
uj5u.com熱心網友回復:
你得到那個輸出的原因是因為它.*是貪婪的。你可以讓它不貪婪.*?。
如果只想輸出匹配項,可以添加-o到grep。
grep -oP '(?<=##).*?(?=##)' file.yaml
輸出
TOPIC
SECRET_KEY
-encoded-
SUFFIX_CODE
如果您只有大寫占位符,中間可以有下劃線,則可以使模式更具體一些。
grep -oP "##\K[A-Z] (?:_[A-Z] )*(?=##)" file.yaml
##字面匹配\K忘記到目前為止匹配的內容(清除當前匹配緩沖區)[A-Z] (?:_[A-Z] )*匹配 1 個大寫字符,可選擇重復_和大寫字符(?=##)正向前瞻,##向右斷言
請參閱正則運算式演示。
輸出
TOPIC
SECRET_KEY
SUFFIX_CODE
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/396794.html
