我有一個舊應用程式,它會生成如下內容:
USERLIST (
"jasonr"
"jameso"
"tommyx"
)
ROLELIST (
"op"
"admin"
"ro"
)
我需要某種形式的正則運算式,僅將USERLIST部分更改為USERLIST("jasonr", "jameso", "tommyx"),其余文本保持不變:
USERLIST("jasonr", "jameso", "tommyx")
ROLELIST (
"op"
"admin"
"ro"
)
除了多行問題,我不知道如何處理僅部分字串的替換。我已經嘗試過 perl ( -0pe) 和 sed,找不到解決方案。我不想寫一個應用程式來做到這一點,肯定有辦法......
uj5u.com熱心網友回復:
perl -0777 -wpe'
s{USERLIST\s*\(\K ([^)] ) }{ join ", ", $1 =~ /("[^"] ")/g }ex' file
在顯示的輸入檔案上列印所需的輸出。為了更容易查看而打破了線條。
使用-0777switch將整個檔案立即讀入一個字串(“slurped”),因此在$_. 模式中的修飾符文字空格將/x被忽略,因此可用于提高可讀性。
解釋
捕獲后面的內容
USERLIST (,直到第一個右括號。這假設里面沒有這樣的括號USERLIST( ... )。在它\K保留之前的所有匹配項(不是從字串中“消耗”出來)并且被排除在 之外$&,因此我們不必在替換端重新輸入它們替換端被評估為代碼,由
/e修飾符提供。在其中,我們從初始捕獲中捕獲所有雙引號子字串$1(假設沒有嵌套引號),并通過,. 然后將獲得的字串用于替換括號中的內容USERLIST
uj5u.com熱心網友回復:
使用您在 GNU 中顯示的示例,awk請嘗試以下awk代碼。
awk -v RS='(^|\n)USERLIST \\(\n[^)]*\\)\n' '
RT{
sub(/[[:space:]] \(\n[[:space:]] /,"(",RT)
sub(/[[:space:]]*\n\)\n/,")",RT)
gsub(/"\n "/,"\", \"",RT)
print RT
}
END{
printf("%s",$0)
}
' Input_file
說明:為 Input_file 的所有行設定RS(記錄分隔符)(^|\n)USERLIST \\(\n[^)]*\\)\n然后在主程式檢查條件中,如果 RT 不為空,則替換[[:space:]] \(\n[[:space:]] 為"(",然后替換[[:space:]]*\n\)\n為),然后替換"\n "為\"最后列印其值。然后在這個程式的END塊列印printf函式中的值來獲取其余的值。
輸出如下:
USERLIST("jasonr", "jameso", "tommyx")
ROLELIST (
"op"
"admin"
"ro"
)
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed '/USERLIST/{:a;N;/^)$/M!ba;s/(\n\s*/(/;s/\n)/)/;s/\n\s*/, /g}' file
如果一行包含USERLIST,請根據需要收集串列和格式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521573.html
