我想要使用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
在每个文件中,我需要进行的更改是相同的。我的问题是:
我可以在bash脚本中调用vim
中的搜索和替换功能吗?
如果是这样,我该如何解决?
PS:我搜索了SO以获得一些回复并找到了一些答案,例如ex
脚本等。我想知道如何在ex
脚本中调用bash
脚本。
答案 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完成它将是以下内容。
一次打开所有目标文件。
vim *.txt
在加载的文件上运行替换命令。
: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_//
如果更改正确,请保存。
:wall
如果编辑者想要自动化,则无法仅表达 替换,记录宏并以与上面相同的方式运行:
: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执行以下操作,
实际上它的运行方式与:global命令相同。
正则表达式搜索后的命令可以是任何命令,包括'!'shell命令“'过滤命令。