在bash脚本中调用vim的搜索和替换函数

时间:2011-08-04 17:04:09

标签: bash vim replace

我想要使用vim处理一个(> 100)个文件。示例文件的文本包含以下内容(仅示例):

xyz.csv        /home/user/mydocs/abc.txt

/home/user/waves/wav.wav , user_wav.wav  

我希望将其替换为:

xyz.csv      /var/lib/mydir/abc.txt
/var/sounds/wav.wav , wav.wav  

在每个文件中,我需要进行的更改是相同的。我的问题是:

  1. 我可以在bash脚本中调用vim中的搜索和替换功能吗?

  2. 如果是这样,我该如何解决?

  3. PS:我搜索了SO以获得一些回复并找到了一些答案,例如ex脚本等。我想知道如何在ex脚本中调用bash脚本。

5 个答案:

答案 0 :(得分:5)

虽然vim非常强大,但我通常不会使用vim。可以使用常见命令行实用程序的组合来完成它。

我假设上面示例中的空白行实际上是空白的,并且不包含空格或任何其他空白字符。您可以使用以下内容来执行您想要的操作。

sed  -e "s,/home/user/mydocs,/var/lib/mydir," -e "s,/home/user/waves,/var/sounds," -e "/^$/d" file1

您可以将该命令与find和for循环一起使用来为一堆文件执行此操作:

for file in `find . -maxdepth 1 -type f`
do
    sed  -e "s,/home/user/mydocs,/var/lib/mydir," -e "s,/home/user/waves,/var/sounds," -e "/^$/d" $file
done

在for循环中,上面的find命令将输出限制为当前目录中的所有文件(包括点文件),将find的输出中的每一行分配给file变量,然后运行{{先前发布的1}}命令可以按照您希望的方式转换文件。

答案 1 :(得分:2)

这是你从bash调用ed脚本的方法:

ed filename <<END
/^$/d
%s|/home/user/mydocs|/var/lib/mydir|
%s|/home/user/waves|/var/sounds|
%s|, user_|, |
w
q
END

答案 2 :(得分:1)

要回答vim,您可以

vim -e 'bufdo!%s:\(xyz.csv        \)/home/user/mydocs/\(abc.txt\n\)\n.*:\1/var/lib/mydir/\2/var/sounds/wav.wav , wav.wav:' -e 'xa' FILES 

注意 ,我原以为第二行被静态替换,就像在问题中看起来一样。

如果您不喜欢在脚本中编写长行,可以创建如下文件:

s/FOO/BAR/
" several replacement and other commands
w " write the file
bd " if you want to

然后做:

vim -e "buffdo!source /your_scriptfile" -e "x" FILES

HTH

答案 3 :(得分:1)

如果所有编辑都包含一系列替换,那么最惯用的方式 用Vim完成它将是以下内容。

  1. 一次打开​​所有目标文件。

    vim *.txt
    
  2. 在加载的文件上运行替换命令。

    :argdo %s#/home/user/mydocs#/var/lib/mydir#
    :argdo %s#/home/user/waves#/var/sounds#
    :argdo %s/, \zsuser_//
    :" etc
    

    或者,在一个命令中:

    :argdo %s#/home/user/mydocs#/var/lib/mydir# | %s#/home/user/waves#/var/sounds# | %s/, \zsuser_//
    
  3. 如果更改正确,请保存。

    :wall
    
  4. 如果编辑者想要自动化,则无法仅表达 替换,记录宏并以与上面相同的方式运行:

    :argdo norm!@z
    

    (此处z是宏的名称。)

    最后,如果编辑应该不时进行并且需要进行 存储为脚本,请尝试使用the answer中描述的方法 similar question

答案 4 :(得分:0)

答案

虽然大多数vim用户都知道%motion命令用于在当前缓冲区中对整个文档执行包含命令。大多数现代版本的vim(即6.x +)支持对正则表达式搜索的操作,如下所示的独占操作:

:/regex/substitute/match/replace/ # as vim command line
+"/reges/s/match/replace"         # as bash cli parameter

这会分解成vim执行以下操作,

  1. 搜索正则表达式并将光标放在找到点的开头
  2. 调用内部替代函数(参见:help s或:help substitute)[可以是其他命令]
  3. 将字符串与正则表达式匹配以进行替换
  4. 替换为新的字符串值
  5. 实际上它的运行方式与:global命令相同。

    备注

    正则表达式搜索后的命令可以是任何命令,包括'!'shell命令“'过滤命令。

    参考帮助

    • :help global
    • :帮助替换
    • :帮助过滤器