在文件的开头插入一个新行

Sar*_*ian 7 regex bash command-line-interface

有没有找到所有文件的方法,*.js并在文件的开头插入一些特定的行?寻找像这样的东西:

find . -name '*.js' -exec sh -c '[insert this 'string'] "${0%.js}"' {} \;

Jam*_*aid 7

这是一种在文件开头添加一行的方法:

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)

  • 谢谢!但是在OSX上还有一些事情,你需要在`-i`之后添加``````sed -i'''1s/^/line_to_be_added \n /'file`或者它不起作用,和`\n`,不起作用,只是忽略`\`并插入符号`n` (3认同)
  • 不,这个'\'$'\n /`所以完整的命令将是'sed -i'''1s/^/line_to_be_added \'$'\n /'file` (3认同)

Tod*_*obs 5

可移植性:使用 Sed 的保持空间

如果您想要一个可移植到 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)

这将打印:

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

您可以将转换保存在脚本中,然后在确定一切按预期方式工作后,使用findxargs和 sed-i标志进行就地编辑。

警告

使用 sed 有一个主要限制:如果文件是空的,它就不会像您预期的那样工作。从您的原始问题来看,这似乎不太可能,但是如果有这种可能性,那么您需要使用诸如cat <(echo foo) example.txt | sponge example.txt就地编辑文件之类的方法,或者使用临时文件并在连接它们后移动它们。

注意:海绵是非标准的。它可以在moreutils包中找到。

  • 说到神秘(在元注释上,因为它似乎是你的习惯):请不要使用“语料库”这个词,因为“输入”或“文本”等更常见的词可以使用。除了不必要的神秘之外,使用“语料库”的方式是[与常用用法不一致](https://www.ahdictionary.com/word/search.html?q=corpus)。 (2认同)