通过清理大型文本文件并根据分隔符拆分成新行来处理大型文本文件

通过清理大型文本文件并根据分隔符拆分成新行来处理大型文本文件

我在多个目录中有一堆同名的文本文件,如下所示:

"[['master', 'planning', 'occur', 'many', 'scale'], ['age', 'smart', 'city', 'municipal']]"

每当新行出现“[”时,我需要分割每一行,直到出现“]:

"[['master', 'planning', 'occur', 'many', 'scale']
['age', 'smart', 'city', 'municipal']]"

我现在想要执行一些数据清理,删除所有特殊字符:

sed s/"'"/""/g m.txt > m1.txt
sed s/'"'/''/g m1.txt > m2.txt
sed s/\]//g m2.txt > m3.txt
sed 's/\[//g' m3.txt > m4.txt
sed s/,//g m4.txt > m5.txt
sed s/\`//g m5.txt > m6.txt
sed 's/\.//g' m6.txt > m7.txt

结果是这样的:

master planning occur many scale age smart city municipal

虽然我实际想要的结果是这样的:

master planning occur many scale 
age smart city municipal

我现在的问题如下:

  1. 我怎样才能对所有行进行这种分割(我不知道每行有多少个[...]结构。并且
  2. 我怎样才能将之后的所有命令总结为一个简洁的小脚本?
sed -e s/"'"/""/g -e s/'"'/''/g -e s/\]//g -e 's/\[//g' -e s/,//g -e s/\`//g -e 's/\.//g' m.txt > m_1.txt 

适合2人!!

答案1

这看起来像一个代表 Perl 数组数组的 Perl 字符串。如果是这样的话,你可以这样做:

$ perl -l -0777 -ne '
  eval "\$string = $_";
  eval "\$list = $string";
  print join " ", @{$_} for @$list' your-file
master planning occur many scale
age smart city municipal

否则,如果只是将], ['s 更改为换行符并删除所有[]'`",字符:

$ sed 's/\], \[/\
/g; s/[]["'\''`,]//g' your-file
master planning occur many scale
age smart city municipal

答案2

使用sed

$ sed -E ":a;s/(\[[^]]*\]+),? /\1\n/;s/[]'\",[]//;ta" input_file
master planning occur many scale
age smart city municipal

相关内容