Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux:如何在单一类型的所有文件中用另一个字符串替换字符串的所有实例_Linux_Replace_Sed_Find - Fatal编程技术网

Linux:如何在单一类型的所有文件中用另一个字符串替换字符串的所有实例

Linux:如何在单一类型的所有文件中用另一个字符串替换字符串的所有实例,linux,replace,sed,find,Linux,Replace,Sed,Find,例如,我想用文件夹中所有.txt文件中包含的“321”替换“123”的所有实例(递归)。 我想过这样做 sed -i 's/123/321/g' | find . -name \*.txt 但是在可能修改我所有的文件之前,我想问一下它是否有效。你有sed和find。使用GNUsed和-i选项,您可以使用: find . -name '*.txt' -type f -exec sed -i s/123/321/g {} + find查找扩展名为.txt的文件,并对这些文件组运行sed-i命令(

例如,我想用文件夹中所有.txt文件中包含的“321”替换“123”的所有实例(递归)。 我想过这样做

sed -i 's/123/321/g' | find . -name \*.txt

但是在可能修改我所有的文件之前,我想问一下它是否有效。

你有
sed
find
。使用GNU
sed
-i
选项,您可以使用:

find . -name '*.txt' -type f -exec sed -i s/123/321/g {} +
find
查找扩展名为
.txt
的文件,并对这些文件组运行
sed-i
命令(最后是
+
;这是POSIX 2008中的标准,但并非所有版本的
find
都必须支持它)。在本例中,没有误解
s/123/321/g
命令的危险,因此我没有将其括在引号中。然而,为了简单和安全起见,最好尽可能将
sed
脚本用单引号括起来

您还可以使用
xargs
(再次使用GNU扩展
-print0
查找
-0
以及
-r
查找
xargs
):

-r
表示“如果没有参数就不要运行”(因此
查找
没有找到任何内容)。
-print0
-0
协同工作,生成以C空字节
'\0'
结尾的文件名,而不是换行符,避免了对包含换行符、空格等的文件名的误解


请注意,在对真实数据运行脚本之前,您可以而且应该对其进行测试。制作一个虚拟目录(我通常称之为
垃圾
),将一些示例文件复制到垃圾目录,将目录更改为垃圾目录,并在这些文件上测试脚本。因为它们是复制品,如果出了什么问题,也不会造成伤害。然后你可以简单地删除目录中的所有内容:
rm-fr垃圾
永远不会给你带来痛苦。

谢谢。稍微调整一下,效果很好:您忘记了查找引号-名称'*.txt'-type f-exec sed-i's/123/321/g{}'+interest;如果有人问我,我会说你的话会破坏它,而不是修复它。但我又是谁来反驳经验证据。。。
find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'