搜索特定文件扩展名上的字符串并将其替换为文件夹名称

搜索特定文件扩展名上的字符串并将其替换为文件夹名称

我想在目录树 (../MyParentFolder) 内的特定文件扩展名 (“*.txt”) 中查找字符串 (“AAA”),并将其替换为子文件夹名称 (MySubfolder)。我知道有人问过类似的问题这里但我无法跳转到替换子文件夹名称。

答案1

使用第三个示例(带有exec接受的答案搜索并替换特定文件扩展名的字符串

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

首先,设置$replace如下:

replace='s/AAA/MySubfolder/'

然后运行find命令。


export注意:您可能会发现在replace开始时需要其他使用命令处理find

export replace='s/AAA/MySubfolder/'

另外,如果任何一行上出现多次“AAA”,并且您希望替换所有这些,那么您将需要进行替换全球的,像这样

s/AAA/MySubfolder/g

答案2

使用 GNUgrep或兼容版本,您可以执行以下操作:

grep -rlZ --include='*.txt' AAA ../MySubfolder |
   perl -MFile::Basename -pi -e '
     BEGIN {local $/ = "\0"; @ARGV = <STDIN>}
     if ($. == 1) {
       $replacement = basename dirname $ARGV;
     }
     s/AAA/$replacement/g;
     close ARGV if eof' ''

wheregrep查找至少txt包含一次的文件,并进行n 处编辑,从文件名中提取文件夹名称以在读取每个文件的st行时进行替换。AAAperliAAA1

因此AAA将被替换为MySubfolderin../MySubfolder/a.txtfooin ../MySubfolder/foo/b.txt

如果你想替换AAAMySubfolderalways,那么只需:

grep -rlZ --include='*.txt' AAA ../MySubfolder |
  xargs -r0 perl -pi -e 's/AAA/MySubfolder/g'

(假设 GNUxargs或兼容)。

GNUsed还支持-ià laperl进行就地编辑,因此您可以使用它来代替perl此处进行简单的替换:

grep -rlZ --include='*.txt' AAA ../MySubfolder |
  xargs -r0 sed -i 's/AAA/MySubfolder/g'

相关内容