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


24

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

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

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

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

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

我从中提取的示例是针对单个文件执行的。我以为我会尝试使用通配符来处理多个文件*.txt

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

Answers:


27

要将文本放在文件之前,可以使用(通过的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

8

您可以使用GNU sed

如前所述,您可以分别sed使用ia命令在与文件匹配的行之前和之后插入文本行。尚未显示的是,您可以使用一个衬纸一次处理多个文件

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

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

双方ia做不仅与行号的工作,而且对每一个给定的模式匹配的行。每当一行包含var y = 2;以下内容时,都会插入注释:

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

5

使用ex以下命令完全兼容POSIX :

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 表示保存更改并退出。


2

这是在Perl中实现的方法:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

@StéphaneChazelas增加-i,而不是这个文件取代它工作,它只是打印到标准输出。
Oleh Prypin '16

@OlehPrypin,的确是您的权利。评论已删除。
斯特凡Chazelas

1

尝试使用ex

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

命令在哪里:

  • bufdo!对每个打开的缓冲区/文件执行以下命令(注意:它不是POSIX
  • 1s/^/HEAD/-将HEAD文本插入到该行的第一行
  • $s/$/TAIL/- TAIL在行的最后一行附加文本

和参数是:

  • -s -静音/快速模式
  • -cxa -保存所有打开的缓冲区/文件并退出
  • *.foo-在当前目录下的所有文件(*)与foo扩展,使用**/*.foo了递归性(使globstar后:shopt -s globstar


1
@StevenPenny是正确的。 个人仅将POSIX指定的功能用于脚本编辑。
2016年

1

使用gnu awk,使用inplace扩展名和BEGINFILE/ ENDFILE

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

也有权(在.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

0

Perl的一线救援:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.