簡體   English   中英

使用sed | awk和group進行替換的正則表達式

[英]Regex with substitutions using sed|awk and groups

我有這個輸入文字

16789248,16789759,"AS24155 Asia Pacific Broadband Wireless Communications Inc"

我想要這個文字

"AS24155","Asia Pacific Broadband Wireless Communications Inc"

此正則表達式匹配

 /(.*)(AS\d+)(\s)([^"]+).*/g

替換為"$2","$4"

我必須處理30萬行,如果能夠使用基於sed或awk的基於Linux的命令行實用程序,那將是最好的選擇,但是即使正則表達式似乎在其他地方也可以匹配,但我一直沒有匹配。

我應該使用其他東西嗎?

sed -r可以進行一些修改: [0-9]代替\\d<space>代替\\s 沒有真正的理由要抓住第一部分和第三部分,因此我刪除了這些組。

sed -r -e 's/.*(AS[0-9]+) ([^"]+).*/"\1","\2"/'

或者,如果你想完全匹配的字符類,使用[[:digit:]]\\d[[:space:]]\\s

sed -r -e 's/.*(AS[[:digit:]]+)[[:space:]]([^"]+).*/"\1","\2"/'

另外,您可以使用csvtool ,它比sed更適合於解析CSV文件。

csvtool col 3 input.txt | while read number name; do
    printf '"%s","%s"\n' "$number" "$name"
done
sed 's/[^"]*"/"/;s[[:space:]]/","/'

根據您的樣本並避免分組的問題

sed是最佳選擇,但僅供參考,這是您可以在GNU awk中幾乎使用您的確切RE來完成的工作:

$ awk 'match($0,/.*(AS[0-9]+)\s([^"]+).*/,a){printf "\"%s\",\"%s\"\n", a[1], a[2]}' file
"AS24155","Asia Pacific Broadband Wireless Communications Inc"

您的原始命令可能失敗,因為只有某些工具接受\\s而不是[[:space:]] ,幾乎沒有工具接受\\d而不是[[:digit:]] (或[0-9] )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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