我有一个相当大的制表符分隔文本文件(大于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
答案 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"好像它是现场分隔符;然后,只有当有三个部分时,才用中间部分的空格替换所有标签。