从大文件中删除模式(〜1G)

问题描述:

我试图从文件中删除此模式/([0-9]+)#(\w)+.(\w)+.(\w)+.(\w)+.(\w)+#/g 我正在使用sed(但我可以使用Linux中的其他任何工具)。从大文件中删除模式(〜1G)

sed 's|/([0-9]+)#(\w)+.(\w)+.(\w)+.(\w)+.(\w)+#/g||g' test.txt 

在上面,我是试图取代正则表达式的命令用一个空字符串匹配(除去正则表达式匹配) 运行这并没有使文件中的任何改变。

以下是我在文件test.txt

3149177#sometext.something.a.e8f933.1414522190425#{....}3149177#sometext.somethingElsea.a12345.e8f932.1414412190425#{.....}3149177#sometext.somethingElsea.a23456.e8f931.1414512190425#{....} 

这里是我想什么有编辑

{....}{.....}{....} 

你有多余的分隔符和g标志。这工作:

sed -i.bak -r 's|([0-9]+)#(\w)+.(\w)+.(\w)+.(\w)+.(\w)+#||g' test.txt 
{....}{.....}{....} 

后,你忘了-i标志sed的,这是负责编辑原地

来自人的报价(BSD sed):

-i extension 
     Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or par- 
     tial content in situations where disk space is exhausted, etc. 

或GNU sed的:

-i[SUFFIX], --in-place[=SUFFIX] 
      edit files in place (makes backup if SUFFIX supplied) 

使用类似

>>> echo "3149177#sometext.something.a.e8f933.1414522190425#{....}3149177#sometext.somethingElsea.a12345.e8f932.1414412190425#{.....}3149177#sometext.somethingElsea.a23456.e8f931.1414512190425#{....}" | sed -r 's/([0-9]+)#(\w)+.(\w)+.(\w)+.(\w)+.(\w)+#//g' 

会给输出

{....}{.....}{....} 

您可以在正则表达式可能减少到这一点:

sed -i.bak -r 's/\d+#\w+(?:\.\w+){4}#//g' test.txt

\d+ 
\# \w+ 
(?: \. \w+){4} 
\# 

如果删除行,而不是空行是一个可能的解决方案

fgrep -v '/([0-9]+)#(\w)+.(\w)+.(\w)+.(\w)+.(\w)+#/g' test.txt