拆分文件内容并使其有序
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
我有这样一个文件:
{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