Sar*_*ian 7 regex bash command-line-interface
有没有找到所有文件的方法,*.js并在文件的开头插入一些特定的行?寻找像这样的东西:
find . -name '*.js' -exec sh -c '[insert this 'string'] "${0%.js}"' {} \;
这是一种在文件开头添加一行的方法:
sed -i '1s/^/line_to_be_added\n/' file
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用上面的代码find来实现您的最终目标:
find . -type f -name '*.js' -exec sed -i '1s/^/line_to_be_added\n/' {} \;
Run Code Online (Sandbox Code Playgroud)
注意:此答案已经过测试并可以使用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' \;
Run Code Online (Sandbox Code Playgroud)
编辑2:正如用户Sarkis Arutiunian指出的那样,我们需要''在表达式\'$'之前添加,然后\n才能在MacOS sed中正常工作.这是一个例子
sed -i '' '1s/^/line_to_be_added\'$'\n/' filename.js
Run Code Online (Sandbox Code Playgroud)
如果您想要一个可移植到 GNU 和 BSD sed的解决方案,请使用以下内容将文本添加到第一行,然后将其余部分保持不变:
sed '1 { x; s/^.*/foo/; G; }' example.txt
Run Code Online (Sandbox Code Playgroud)
假设一个语料库:
bar
baz
Run Code Online (Sandbox Code Playgroud)
这将打印:
Run Code Online (Sandbox Code Playgroud)foo bar baz
您可以将转换保存在脚本中,然后在确定一切按预期方式工作后,使用find或xargs和 sed-i标志进行就地编辑。
使用 sed 有一个主要限制:如果文件是空的,它就不会像您预期的那样工作。从您的原始问题来看,这似乎不太可能,但是如果有这种可能性,那么您需要使用诸如cat <(echo foo) example.txt | sponge example.txt就地编辑文件之类的方法,或者使用临时文件并在连接它们后移动它们。
注意:海绵是非标准的。它可以在moreutils包中找到。
| 归档时间: |
|
| 查看次数: |
3696 次 |
| 最近记录: |