如何将以给定字符串开头的序列的所有出现替换为符号的下一个出现?

如何将以给定字符串开头的序列的所有出现替换为符号的下一个出现?

我想编辑一个巨大的单行文件,其中包含数千次出现的某个字符串,'string_string':直到下一次出现逗号,(包括此逗号),然后从文件中删除这些出现的情况。

我认为可以使用sedorawk来做到这一点。它们被宣传为操作字符串/字符流的工具,但也更适用于多行文件。

由于awksed命令都可能具有某种神秘性,并且我想在解决日常出现的不同问题的同时进行学习,所以我希望您对结果命令本身进行简要解释。

我的第一个方法是运行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

相关内容