【问题标题】:vim, ed or sed multiple search and replace on a given filevim、ed 或 sed 对给定文件进行多次搜索和替换
【发布时间】:2013-05-02 13:36:54
【问题描述】:

我想对给定文件(例如 file.txt)进行一系列“搜索和替换”。 例如,

s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
g/string-delete/d 

等等。

我应该如何在脚本文件中编写所有这些操作,然后在目标 file.txt 上一次性运行它们以将其保存到 newfile.txt?

我看到了这篇帖子 Search and replace variables in a file using bash/sed,但不知何故无法让它为我工作。

编辑:我更喜欢基于 vim/ed 的解决方案 谢谢 时态

【问题讨论】:

标签: search vim replace ed


【解决方案1】:

使用:source {file} 运行vim 脚本。

将您的命令保存到文件中,例如commands.vim。然后打开您要应用命令的缓冲区并获取commands.vim 文件,如下所示:

:so commands.vim

注意::so:source 的缩写

如需更多帮助,请参阅:

:h :so

【讨论】:

    【解决方案2】:

    您可以将命令放在一个文件中并将其传递给sed -f

    $ cat commands.sed↵
    s/foo/bar/g
    s/abc/xyz/g
    s/pqr/lmn/
    /string-delete/d
    $ sed -f commands.sed my_input.txt > my_output.txt↵
    

    甚至把它做成一个shell脚本

    $ cat munge.sed↵
    #!/bin/sed -f
    s/foo/bar/g
    s/abc/xyz/g
    s/pqr/lmn/
    /string-delete/d
    $ chmod a+x commands.sed↵
    $ ./munge.sed my_input.txt > my_output.txt↵
    

    最后,您可以将命令直接传递给sed(1) 作为单行:

    $ sed -e "s/foo/bar/g" -e "s/abc/xyz/g" -e "s/pqr/lmn/" -e "/string-delete/d" my_input.txt > my_output.txt↵
    

    【讨论】:

      【解决方案3】:

      您可以编写一个函数来包装这些命令,然后调用该函数。

      注意!!

      下面的函数是一个例子,我在你的s cmd前面添加了%。因为我猜您想在整个缓冲区上进行替换,而不是在“当前”行上。但是你必须小心,这样,如果后面的模式匹配,前面的替换结果可能会被后面的命令再次替换。只需根据需要进行调整即可。

      例如想一想:

      文字:fooc 你有%s/foo/ab/g%s/abc/def/g

      fun! ExecThem()
          %s/foo/bar/g
          %s/abc/xyz/g
          %s/pqr/lmn/g
          g/string-delete/d
      endf
      

      获取函数,然后

      :call ExecThem()
      

      会做的。

      你当然可以为此创建一个命令:

      command Mybatch call ExecThem()
      

      【讨论】:

      • 为什么要使用execute 命令? %s/foo/bar/g 是一个 ex 命令,就像 execute 一样。
      • @PeterRincker 我从现有函数之一复制了一些行,s/../../ 中有变量,我删除了变量和引号,但没有将 exec 取出..
      【解决方案4】:

      一种简单快捷的方法是将命令复制到带有"ay 的寄存器中,然后使用@a 将寄存器作为macro 运行。

      【讨论】:

      • 我更喜欢函数方式,或者在这种情况下,额外的脚本文件(如@Peter的答案)比宏更好。不是因为我给出了这样的答案。想了两天,我们发现我们需要在那个“注册”中再添加一行s/../../,哦,再过两天,我们发现我们想将第一行改为%s/foo/baz/g,又过了3天....你明白我的意思。
      • 这就是我说“简单快捷”的原因,它的意思是你需要在同一天做一次或几次然后忘记它。有替代品可供选择是件好事
      猜你喜欢
      • 2014-12-03
      • 2018-11-16
      • 2021-02-18
      • 2011-07-29
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多