Linux

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

  • May 20, 2022

我正在使用findsed命令來查找並用其他一些句子替換整個目錄中某些句子的出現。

例如,如果我想將某個目錄 ( ) 的所有文件中所有出現的句子替換He went為,我執行以下操作:She goes``\home\user\

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

現在我想執行上述命令,但要執行幾句話。為此,我有一個製表符分隔文件,其中包含要在 LHS 上替換的句子和 RHS 上的新句子。

例如

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

有沒有辦法修改上述命令以適應這種製表符分隔的文件,而不是手動獲取句子?

您可以分兩步執行此操作,在第一階段,使用製表符分隔的表格文件,我們生成一組grep& sedcommands ,並將它們儲存在不同的層次結構中,以便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

引用自:https://unix.stackexchange.com/questions/703199