新手求助:如何在gvim/awk/sed中实现指定文本替换?
没问题!我来帮你搞定这个文本替换需求,不管用GVim、Sed还是Awk都能轻松实现,下面给你逐个拆解具体方法:
1. 用GVim/Vim完成替换
你之前用:%s/^.*"/出问题,是因为这个正则会匹配从行首到最后一个双引号的所有内容,替换后自然只剩后面的-nothing了。我们需要用正则捕获分组来精准提取需要保留的内容,再重新拼接成目标格式。
在GVim里输入这个命令就行:
:%s/"\([^"]*\)" -\([^ ]*\)/\1" - \2/g
我给你拆解下这个命令的逻辑:
":匹配开头的双引号\([^"]*\):用括号捕获双引号里的内容(也就是你例子里的word,[^"]*表示匹配任意非双引号的字符)" -:匹配中间的" -部分\([^ ]*\):捕获后面的nothing部分([^ ]*表示匹配任意非空格的字符)- 替换后的
\1" - \2:把第一个捕获组(word)放前面,加双引号,然后是-(空格-空格),最后放第二个捕获组(nothing) - 末尾的
g表示全局替换,如果一行里有多个符合格式的内容,都会被替换掉;如果每行只有一个,不加g也可以。
2. 用Sed工具实现替换
Sed是处理文本替换的常用命令行工具,逻辑和Vim类似,直接在终端里运行:
sed 's/"\([^"]*\)" -\([^ ]*\)/\1" - \2/g' your_file.txt
如果想直接修改原文件(原地替换),加上-i参数:
sed -i 's/"\([^"]*\)" -\([^ ]*\)/\1" - \2/g' your_file.txt
3. 用Awk工具实现替换
Awk可以通过正则匹配捕获内容,再重新拼接输出,命令如下:
awk '{match($0, /"([^"]*)" -([^ ]*)/, arr); print arr[1] "\" - " arr[2]}' your_file.txt
这里用match函数匹配目标格式,把捕获到的word和nothing存到数组arr里,然后按你要的格式打印出来。
如果你的文本里word或nothing包含特殊字符(比如空格),可以再调整正则的匹配规则,不过针对你给出的例子,上面的命令完全够用啦!
内容的提问来源于stack exchange,提问作者Vinut V Patil
相关产品推荐
相关产品推荐

