拆分文件内容并使其有序

Splitting content of file and make it in order

我有这样一个文件:

{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

使用 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=':' '{=} gsub(/[{}]|\n/, "")' file

甚至这个:

awk -v FPAT='{[^{}]{2,}' -v OFS=':' '{=} gsub(/[{}]/, "")' file

Perl 解决方案

perl -nwe 'print join ":", /{([^{}]{2,})/g' file

正则表达式提取一个 curlie 后面的 2 个或多个非 curlies 组,然后用冒号分隔它们。

对于此特定格式

sed -n 's/...//;s/}[^{]*//g;s/{/:/gp' YourFile