如何在 Bash 中将文本附加到多个文本文件的开头和结尾?

如何在 Bash 中将文本附加到多个文本文件的开头和结尾?

我有一个充满文本文件的目录。我的目标是将文本附加到所有内容的开头和结尾。每个文件开头和结尾的文本都是相同的。

根据我从网上获得的代码,这是附加到文件开头的代码:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

这是附加到文件末尾的代码。目标是};在每个文件的末尾添加文本:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

我引用的示例是针对单个文件进行操作的。我想我应该尝试使用通配符*.txt.

我可能还会犯其他错误。无论如何,如何将文本附加到多个文件的开头和结尾?

答案1

要将文本添加到文件中,您可以使用(通过 GNU 实现sed):

sed -i '1i some string' file

附加文本就像这样简单

echo 'Some other string' >> file

最后要做的事情是将其放入一个循环中,该循环会迭代您要编辑的所有文件:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

答案2

您可以使用 GNU sed

sed如前所述,您可以分别使用i和命令在文件的匹配行之前和之后插入文本行a。尚未展示的是,您可以使用一行代码来完成此操作多个文件立刻。

1i下面将在第一行之前和最后一行之后插入一行$a。将为所有与 glob 匹配的文件执行插入*.txt

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

i不仅a适用于行号,而且适用于与给定模式匹配的每一行。每当一行包含以下内容时,就会插入注释var y = 2;

sed -i -- '/var y = 2;/i//initialize variable y' *.js

答案3

完全 POSIX 兼容的命令,使用ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

如果您printf单独运行该命令的一部分,您将看到它传递给的确切编辑命令ex

0a
var language = {
.
$a
};
.
x

0a表示“在第 0 行之后追加文本”(换句话说,在第一行之前)。下一行是要在第 0 行之后“追加”的文字文本。.一行上的句点 ( ) 本身结束要追加的文本。

$a表示在文件最后一行之后追加文本。

x表示保存更改并退出。

答案4

也有权(结果在.out文件中):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

另一个更详细的变体 - 源文件替换为结果:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

相关内容