我在檔案中有這一行。單詞之間的空格可以是制表符或空格
#define FN_AUTO_FN_FNSECTOR Function(2) /* FN_ comment*/
我希望輸出是這樣的:
2:"FN_AUTO_FN_FNSECTOR",
我有這個代碼:
echo -e "#define \t \t\t FN_AUTO_FN_FNSECTOR \t\t\t Function(2)\t /* FN_ comment*/" |sed "s/.*\(\([[:blank:]]\)FN_*[_a-zA-Z]*\).[^ ].*(\([^\)]*\)).*/\3:\"\1\",/"
但是輸出在 quote 和 FN_AUTO_FN_FNSECTOR 之間帶有前面的空格:
2:" FN_AUTO_FN_FNSECTOR",
我怎樣才能避免它?解決方案必須是健壯的空格或制表符不得影響選擇。我的解決方案必須在 sed 中,最好在一個命令中。
解決方案: 感謝亞倫。我喜歡的解決方案是這個
echo -e "#define \t\t\r FN_AUTO_FN_FNSECTOR \t\r\t\t Function(2)\t /* FN_ comment*/" |sed "s/.*\s\(FN_*[_a-zA-Z]*\).[^ ].*(\([^\)]*\)).*/\2:\"\1\",/"
uj5u.com熱心網友回復:
在您的 sed 命令中,第一個捕獲組(從您的第一個開口開始)\(包含[[:blank:]]與前面的空格匹配的類FN_AUTO_FN_FNSECTOR。
我建議使用以下命令:
sed -E 's/.*\s(FN_*[_a-zA-Z]*).*\(([^)])\).*/\2:\"\1"/'
在這里測驗。
在此命令中,我使用-E切換到擴展正則運算式,其中(...)表示捕獲組,而\(...\)表示文字括號。它還使我(至少在現代 GNU sed 上)能夠\s用來表示空白。
uj5u.com熱心網友回復:
使用sed
$ sed 's/[^[:space:]]*[[:space:]]\([^[:space:]]*\)[^(]*(\(.\).*/\2:"\1",/' input_file
2:"FN_AUTO_FN_FNSECTOR",
uj5u.com熱心網友回復:
您可以使用
sed -E 's/.*[[:blank:]](FN[^[:blank:]]*)[[:blank:]] [^[:blank:]] \(([^()])\).*/\2:"\1",/'
如果你有 GNU sed,你可以[[:blank:]]用\s(任何空格)和[^[:blank:]](\S任何非空格)替換:
sed -E 's/.*\s(FN\S*)\s \S \(([^()]*)\).*/\2:"\1",/'
查看在線演示:
#!/bin/bash
s='#define FN_AUTO_FN_FNSECTOR Function(2) /* FN_ comment*/'
sed -E 's/.*[[:blank:]](FN[^[:blank:]]*)[[:blank:]] [^[:blank:]] \(([^()]*)\).*/\2:"\1",/' <<< "$s"
## => 2:"FN_AUTO_FN_FNSECTOR",
請注意,該-E選項允許 POSIX ERE 語法,其中未轉義 是一個或多個量詞,并且要定義捕獲組,您需要未轉義的括號對。
圖案細節:
.*- 任何文字[[:blank:]]- 一個水平空白字符(FN[^[:blank:]]*)- 第 1 組:FN以及零個或多個非空白字符[[:blank:]]- 一個或多個水平空白字符[^[:blank:]]\(- 文字(字符(在 POSIX BRE 中,它不應該被轉義,但在 ERE 中,它必須)([^()]*)(- 第 2 組:除and以外的任何零個或多個字符)(請注意,(和)括號內的運算式不需要在任何 POSIX(以及我所知道的所有非 POSIX)正則運算式風格中轉義)\))- POSIX ERE 中的文字.*- 任何文字
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451481.html
下一篇:dup2的問題
