从终端向文本文件添加字符串

从终端向文本文件添加字符串

我想从终端修改一堆文本文件,更准确地说:

将字符串“50”添加到 /mydat/ 中每个文本文件的第一行?

或者,如果您知道网络上某个页面的链接,其中列出了从 shell 操作文本文件的命令......

答案1

find并且sed是您选择的武器:

find /mydat/ -exec sed '1i 50' {} \;

它将保留50在文件开头的新行。

或者,如果您不需要递归或复杂的选择器,find您可以完全删除find

sed '1i 50' *

答案2

要编辑文件,您需要一个编辑器。edex是基于命令的编辑器的示例,它们对于从脚本编辑文件很有用。以下是使用 ed 向 /mydata 中每个扩展名为 .txt 的文件插入一行的示例:

#!/bin/bash
for file in /mydata/*.txt; do
    printf '%s\n' 0a 50 . w | ed -s "$file"
done

这也将处理文件名中的所有奇怪的字符,与迄今为止给出的答案中使用for-loops的所有示例不同。ls

以下是描述如何使用 ed 的链接:http://bash-hackers.org/wiki/doku.php?id=howto:edit-ed

为了掌握 bash,我强烈建议阅读http://mywiki.wooledge.org/BashGuide

答案3

本质上,您需要循环遍历目录中的每个文本文件,然后在开头添加一小段字符串。如果将其分为两个步骤,这并不难。

要将字符串添加到文件的开头,格式如下:

echo "50 $( cat file.txt )" > file.txt

如果出现cannot overwrite existing file错误,则需要禁用 noclobber

set +o noclobber

现在您只需将其放入循环遍历您想要更改的文件的循环中。

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "${FILE}"
done

如果输出正确,则添加要修改的文件(如下所示)。如果没有,则修改 grep 语句,直到符合您的需要。

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "50 $( cat ${FILE} )" > "${FILE}"
done

如果你想用一行完成它:

for FILE in $( ls /mydata/ | grep txt$ ) ; do echo "50 $( cat ${FILE} )" > "${FILE}"; done

编辑

如果您希望 50 独占一行,请使用 printf 代替\necho,如下所示。

for FILE in $( ls /mydata/ | grep txt$ ) ; do printf "50\n$( cat ${FILE} )" > "${FILE}"; done

答案4

在文件末尾添加文本相对简单。对于 BASH:echo 50 >> file.txt将在 file.txt 的末尾附加 50。将其包装在 for 循环中,如下所示: 将遍历当前目录中的所有文件,并将 50 附加到末尾。请注意,单引号实际上是 `,但这是此处代码标记的指示符……呸。要将其添加到每个文件的顶部,请创建一个临时文件并将 50 回显到其中,然后回显文件的内容。然后重命名文件以覆盖原始文件。将其包装在脚本中,您就大功告成了!for $FILE in 'ls' do echo 50 >> $FILE; done;for $FILE in * do echo 50 >> $FILE; done;

#!/bin/bash

echo "Adding 50 to each file in current directory."

for $FILE in *
do
[[ -f "$i" ]] || continue
echo "50" >> tmp
cat "$FILE" >> tmp
mv tmp "$FILE"
done

这应该可以工作,但是在执行任何重要操作之前,先在测试目录上运行它。

编辑:按照 Mahesh 的评论建议更新了脚本。

相关内容