这个问题已经在这里有一个答案:
这是任何方式找到像*.js
的所有文件,并在文件的开头插入一些具体的线路?寻找类似:
find . -name '*.js' -exec sh -c '[insert this 'string'] "${0%.js}"' {} \;
这里有一个方法添加一行到文件的开头:
sed -i '1s/^/line_to_be_added\n/' file
然后,你可以使用上面的代码与find
实现自己的终极目标:
find . -type f -name '*.js' -exec sed -i '1s/^/line_to_be_added\n/' {} \;
注意:这个答案进行了测试,并与GNU
sed
工作。
编辑:上面的代码不会对一个.js
文件是空的正常工作,因为sed
以上命令的空文件没有按预期工作。一种解决方法,以这将是测试,如果该文件是空的,并且如果它是,添加经由echo
所需的行,否则经由sed
添加所需的线路。这一切都可以在(长)的一行来完成,如下所示:
find . -type f -name '*.js' -exec bash -c 'if [ ! -s "{}" ]; then echo "line_to_be_added" >> {}; else sed -i "1s/^/line_to_be_added\n/" {}; fi' \;
编辑2:由于用户萨尔基斯Arutiunian指出,我们需要添加''
表达和\'$'
前\n
,使这项工作正常在sed的MacOS之前。下面的例子
sed -i '' '1s/^/line_to_be_added\'$'\n/' filename.js
编辑3:这也适用,并且编辑将知道如何语法高亮它:
sed -i '' $'1s/^/line_to_be_added\\\n/' filename.js
如果你想与GNU都和BSD sed的作品便携的解决方案,使用以下方法来添加文字到第一线,然后通过不变通的其余部分:
sed '1 { x; s/^.*/foo/; G; }' example.txt
假设的语料库:
bar
baz
这将打印:
foo bar baz
您可以保存转型的脚本,然后使用查找或xargs的和sed的-i
标志就地一旦您确定一切工作您预期的方式编辑。
使用SED有一个主要的限制:如果该文件是空的,它不会工作,正如您所料。这不是东西,很可能从原来的问题,但如果这是一个可能性,那么你需要使用类似cat <(echo foo) example.txt | sponge example.txt
编辑就地文件,或使用临时文件和连接它们之后移动它们。
注意:海绵是非标准。它可以在moreutils包中找到。