我想在目录树 (../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行时进行替换。AAA
perl
i
AAA
1
因此AAA
将被替换为MySubfolder
in../MySubfolder/a.txt
和foo
in ../MySubfolder/foo/b.txt
。
如果你想替换AAA
为MySubfolder
always,那么只需:
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'