查找并替换所有文件中的单词,这符合Unix的搜索条件

时间:2018-04-10 19:40:48

标签: linux shell unix sed find

我想替换所有子目录中的所有文件中的单词,这些单词满足一些条件。

以下是详细说明的情况。

  

我必须替换所有具有不区分大小写的单词的Word   {classy,CLASSY,cLassy,..}来说“Vintage”。我也只需要   将其替换为不区分大小写的单词“insert”或“INSERT”。

所以,如果我有2个文件低于内容。

File1.txt
asd asdsd INSERT asdasd classy
asddsdff sdf sdff sdf  CLASSY
sfre asfert asdd asd insert asdgweg 
qwe asfer wrererw  werer wewer INSERT CLassy


File2.txt
fhfgh asdsd insert asdasd ClASSY
asddsdff dfg  sdff sdf  CLASSY
sdgg asfert dfg asd insert asdgweg CLASSY
qwe asfer wrererw  werer wewer INSERT 

我想将文件的内容更改为

File1.txt
asd asdsd INSERT asdasd Vintage
asddsdff sdf sdff sdf  CLASSY
sfre asfert asdd asd insert asdgweg 
qwe asfer wrererw  werer wewer INSERT Vintage

File2.txt
fhfgh asdsd insert asdasd Vintage
asddsdff dfg  sdff sdf  CLASSY
sdgg asfert dfg asd insert asdgweg Vintage
qwe asfer wrererw  werer wewer INSERT 

以下是我使用的命令,但它运行不正常。你能帮我理解一下这个问题。

find /rootFolderPath -name "*.txt" | xargs grep -i insert -exec sed -i -e 'classy/Vintage/I' -- {} +

1 个答案:

答案 0 :(得分:5)

您可以gnu-sed使用find作为:

cd /rootFolderPath
find . -name '*.txt' -exec \
     sed -i '/\binsert\b/I{s/\bclassy\b/Vintage/gI;}' {} +

以下是sed命令的作用:

  • -i:内联编辑
  • /\binsert\b/I:在一行中搜索字符串insert(对I不区分大小写;对于字边界不区分{}}
  • \b:如果在一行中找到{s/\bclassy\b/Vintage/gI;},则将insert替换为classy(再次\ b Vintageis for word boundaries, g`是全球搜索)