![如何在 Bash 中将文本附加到多个文本文件的开头和结尾?](https://linux22.com/image/29544/%E5%A6%82%E4%BD%95%E5%9C%A8%20Bash%20%E4%B8%AD%E5%B0%86%E6%96%87%E6%9C%AC%E9%99%84%E5%8A%A0%E5%88%B0%E5%A4%9A%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E5%BC%80%E5%A4%B4%E5%92%8C%E7%BB%93%E5%B0%BE%EF%BC%9F.png)
我有一个充满文本文件的目录。我的目标是将文本附加到所有内容的开头和结尾。每个文件开头和结尾的文本都是相同的。
根据我从网上获得的代码,这是附加到文件开头的代码:
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