问题:原意在本文件夹下所有P*.txt文件中用string2替换掉string1,于是输入shell命令: find . -name "P*.txt" | sed -i 's/string1/string2/',发现得不到自己想要的结果。于是简单的了解一下管道的原理以及find,xargs联合使用方式。
1,什么是管道?
指前一个程序的标准输入作为后一个程序的标准输入。
注意:1)管道命令只处理前一个命令正确输出,不处理错误输出
2)管道命令右边命令,必须能够接收标准输入流命令才行。
find命令会在终端(标准输出)上打印出找到的文件。则sed的标准输入是包含文件名的文本。
~/Desktop/test$:ls
P1.txt P2.txt
在test文件夹下有P1.txt,P2.txt两个文件,每个文件内容为“string1",若find . -name "P*.txt" 的标准输出是在屏幕上打印出
~/Desktop/test$:find . -name "P*.txt"
./P2.txt
./P1.txt
所以sed处理的是文件名,而不是对文件内的文本进行处理
~/Desktop/test$:find . -name "P*.txt" | sed -n 's/P/S/p'
./S2.txt
./S1.txt
所以find . -name "P*.txt" 返回./P2.txt,./P1.txt.则find . -name "P*.txt" | xargs sed -n 's/string1/string2/p'中后个一个命令实际是sed -n 's/string1/string2/p' P1.txt P2.txt,即对文件进行处理而不是文件名。
~/Desktop/test$:find . -name "P*.txt" | xargs sed -n 's/string1/string2/p'
string2
string2
同样我们可以用grep命令
~/Desktop/test$:find . -name "P*.txt" | grep 'P'
./P2.txt
./P1.txt
比较上下两者的不同。
~/Desktop/test$:find . -name "P*.txt" | xargs grep 'string1'
./P2.txt:string1
./P1.txt:string1