如何嵌套sed替换?

时间:2015-05-17 03:41:47

标签: regex sed

我有一个相当大的制表符分隔文本文件(大于8 GB)。有些行在某些字段之间有额外的标签,我想使用模式用空格替换这些标签:

'android(\t.*)+android'

但是,这需要使用sed.exe进行嵌套替换。这个问题有一个很好的解决方案吗?

以下是我的演示数据,在第1行中,Android*Android之间有4个额外的标签需要删除。

1   372C00365B22        103 20150423135612  Android 2.3 wzapp   3.1.0   Android 5   200 1
2   372C00365B23        103 20150424175612  IOS 2   200 1
13  372C005EB183        103 20150423231051  Agoo-sdk-2.0    0       6       1

3 个答案:

答案 0 :(得分:1)

我不确切地知道您更换多个标签时所说的内容。

如果您只是想要在遇到任何时候用一个空格替换多个标签,这应该足够了:

cat file | sed 's|[[:blank:]]\{1,\}| |g'

如果您想将多个标签更改为单个标签,请执行以下操作:

cat file | sed "s|[[:blank:]]\\{1,\\}|$(printf '\t')|g"

如果你的问题意味着你需要在另一个之后应用一个sed表达式,那也是可行的:

cat file | sed -e "s|expr1|expression1|g" -e "s|expr2|expression2|g"

两个表达式将一个接一个地应用于该行。通过这种方式,您可以进行替换,然后替换该替换。

请参阅docs

答案 1 :(得分:1)

您可以使用循环来替换替换,但这可能不是最快的方法。如果你在一条线上有更多的android(并且你没有锚点来修复一对),它也可能无效:

sed ':l s/\(android.*\)\t\t\t*\(.*android\)/\1\t\2/;tl' input

答案 2 :(得分:1)

您可以使用更高级别的语言将输入分为三个部分,然后只需替换中间部分的标签。

awk -F 'android' 'NF==3 { gsub(/\t/, " ", $2) }1' input

这会尝试将每个输入行拆分为" android"好像它是现场分隔符;然后,只有当有三个部分时,才用中间部分的空格替换所有标签。