仅在文件开头没有找到+ sed追加行

时间:2018-12-28 22:45:01

标签: bash sed grep

我正在编写一个脚本,该脚本在目录中文件的开头添加一行。下面的代码可以做到这一点。

 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。我只是在目录中运行此脚本,所以没有输入文件。谢谢。

3 个答案:

答案 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)

不需要

grepsed可以进行否定搜索,并使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