如何使用find和sed替换文件中的某些句子

如何使用find和sed替换文件中的某些句子

我正在使用findsed命令来查找整个目录中出现的某些句子并将其替换为其他句子。

例如,如果我想替换某个目录 ( ) 的所有文件中所有出现的句子He wentto ,我会执行以下操作:She goes\home\user\

find '/home/user' -type f | xargs sed -i  's/He went/She goes/g'

现在我想做上面的命令,但要执行几句话。为此,我有一个制表符分隔的文件,其中包含我想要在左侧替换的句子和右侧的新句子。

例如

He went\tShe goes
<h1>They tried<\h1>\t<h2>They did not try<\h2>

有没有办法修改上面的命令以适应此类制表符分隔的文件,而不是手动获取句子?

答案1

您可以通过两步过程来完成此操作,在第一阶段,使用制表符分隔的表文件,我们生成一组grep&sed命令,并将它们存储在不同的层次结构中,以便find找不到它们并因此修改他们有潜力。

##1> generate commands
sed -E '
  h;s/.*\t//
  # escape characters special on rhs
  s:[\&/]:\\&:g

  # grep code
  x;s/\t.*//w/tmp/code.grep

  # lhs escaping
  s:[][$^.*\/]:\\&:g;G

  # stitch lhs rhs & form a s/// 
  s:^|\n|$:/:g;s/.*/s&g/

' file.cmds > /tmp/code.sed

##2> use the commands

find /home/user -type f \
  -exec grep -qF -f /tmp/code.grep {} \; \
  -exec sed -i -f /tmp/code.sed {} + ;


  • 您应该将动态生成的代码文件放置在与您正在搜索的层次结构不同的层次结构中。

  • 表文件应使用文字 TAB 而不是其符号\t ,因为在代码生成期间它将被视为两个字符,abackslash后跟字母表。t

相关内容