我正在编写一个脚本,该脚本在目录中文件的开头添加一行。下面的代码可以做到这一点。
find . -type d \( -name ThirdParty -o -name 3rdParty -o \
-name 3rd_party \) \
-prune -o -type f \( -name "*.java" -o -name "*.cs" -o \
-name "*.cpp" -o -name "*.cxx" -o \
-name "*.cc" -o -name "*.c" -o \
-name "*.h" -o -name "*.scala" -o \
-name "*.css" -o -name "*.js" \) \
-print0 |
xargs -0 sed -i '1s/^/\/*RIGHTS AND ETC ETC ETC/*'
但是,我只想添加该行(如果该文件尚未存在)。我曾尝试使用grep
和管道,然后再这样使用sed
:
grep -q "/*RIGHTS AND ETC ETC ETC/*" | sed -i....
但是,当我运行脚本时,我得到了sed: no input files
。我只是在目录中运行此脚本,所以没有输入文件。谢谢。
答案 0 :(得分:0)
您的grep
命令不会打印任何内容,因为您使用了-q
选项;只是根据文件是否匹配来设置退出状态。
您要打印所有不匹配的文件名,因此可以将这些文件名传递给sed
。您可以使用-L
选项和-z
来执行此操作,以使用空终止符而不是换行符(例如-print0
中的find
选项)。
您还应该使用-F
将字符串视为固定字符串,而不是正则表达式模式。
find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) -prune \
-o -type f \( -name "*.java" -o -name "*.cs" -o -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" -o -name "*.c" -o -name "*.h" -o -name "*.scala" -o -name "*.css" -o -name "*.js" \) -print0 |
xargs -0 grep -Lz -F "/*RIGHTS AND ETC ETC ETC/*" |
xargs -0 sed -i ...
答案 1 :(得分:0)
grep
。 sed
可以进行否定搜索,并使i
nsert 有条件:
... -print0 | xargs -0 sed -i '1{/^\/\*RIGHTS AND ETC ETC ETC\*\/$/!i\
/\*RIGHTS AND ETC ETC ETC\*/
}'
注意:
三行代码中的换行符对于i
正常工作是必需的。
尚不清楚*
是否为文字,因此它们的引用方式为\*
。
答案 2 :(得分:0)
这可能对您有用(GNU sed并找到):
C & container;
(var="/*RIGHTS AND ETC ETC ETC/*" ;
find whatever \! -exec grep -qF "$var" {} \; -exec sed -i '1i\'"$var" {} \;)
是最初的查找命令。
仅当grep在每个文件的任何地方都找不到whatever
时,才会插入变量var
。