我有一个这样的文件:
{A{AAA} B{BBB} test {CCC CCC
}}
{E{EEE} F{FFF} test {GGG GGG
}}
{H{HHH} I{III} test {JJJ -JJJ
}}
{K{KKK} L{LLL} test {MMM
}}
我想使用linux命令以获得以下输出:
AAA:BBB:CCC CCC
EEE:FFF:GGG GGG
HHH:III:JJJ -JJJ
KKK:LLL:MMM
答案 0 :(得分:3)
使用gnu-awk你可以这样做:
awk -v RS='}}' -v FPAT='{[^{}]+(}|\n)' -v OFS=':' '{for (i=1; i<=NF; i++) {
gsub(/[{}]|\n/, "", $i); printf "%s%s", $i, (i<NF)?OFS:ORS}}' file
AAA:BBB:CCC CCC
EEE:FFF:GGG GGG
HHH:III:JJJ -JJJ
KKK:LLL:MMM
-v RS='}}'
将使用}}
文字-v FPAT='{[^{}]+(}|\n)'
将使用给定的正则表达式分割字段。正则表达式匹配以{
开头的每个字段,并匹配除{ and }
后跟}
或换行符之外的任何字段。-v OFS=':'
将输出字段分隔符设置为:
gsub(/[{}]|\n/, "", $i)
从每个字段中删除{
或}
或换行符更短的命令(感谢JoseRicardo):
awk -v RS='}}' -v FPAT='{[^{}]+(}|\n)' -v OFS=':' '{$1=$1} gsub(/[{}]|\n/, "")' file
甚至是这样:
awk -v FPAT='{[^{}]{2,}' -v OFS=':' '{$1=$1} gsub(/[{}]/, "")' file
答案 1 :(得分:1)
Perl解决方案
perl -nwe 'print join ":", /{([^{}]{2,})/g' file
正则表达式在curlie之后提取2个或更多个非curlies的组,然后用冒号分开打印。
答案 2 :(得分:1)
这种特定格式
sed -n 's/...//;s/}[^{]*//g;s/{/:/gp' YourFile