我想编辑一个巨大的单行文件,其中包含数千次出现的某个字符串,'string_string':
直到下一次出现逗号,
(包括此逗号),然后从文件中删除这些出现的情况。
我认为可以使用sed
orawk
来做到这一点。它们被宣传为操作字符串/字符流的工具,但也更适用于多行文件。
由于awk
和sed
命令都可能具有某种神秘性,并且我想在解决日常出现的不同问题的同时进行学习,所以我希望您对结果命令本身进行简要解释。
我的第一个方法是运行vim
一个记录的序列,但现在已经运行了 3 小时,甚至还没有接近结束 - 即使它会在某个时间点解决问题,我想知道一种更好、更有效的方法。
请求的示例:
['string_string': <asdffds.1j2_3>, 'abd_dfA': 212, 'kajaj': <asdffdsa>, 'string_string': <fdjjdjd.asjsk2222>, 'jsjsjsj': 32.23],
['string_string': <asdffds.1j2_3>, 'abd_dfA': 212, 'kajaj': <asdffdsa>, 'string_string': <fdjjdjd.asjsk2222>, 'jsjsjsj': 32.23]
结果:
[ 'abd_dfA': 212, 'kajaj': <asdffdsa>, 'jsjsjsj': 32.23],
[ 'abd_dfA': 212, 'kajaj': <asdffdsa>, 'jsjsjsj': 32.23]
答案1
如果您sed
可以处理长于 LINE_MAX 的行(在某些系统上低至 1024 字节),您可以这样做:
sed "s/'string_string':[^,]*,//g" < your-file
如果没有,您可以随时使用perl
:
perl -pe "s/'string_string':.*?,//g" < your-file
答案2
一种方法是,使用字符串处理来监视 string_string 和逗号的位置,一个接一个。每对中:
perl -plse '
substr($_,$p-1,$q-$p+1,"")
while
++($p=index($_,$s,$q-$p)) &&
++($q=index($_,",",$p));
' -- -s="'string_string':" file