我想从终端修改一堆文本文件,更准确地说:
将字符串“50”添加到 /mydat/ 中每个文本文件的第一行?
或者,如果您知道网络上某个页面的链接,其中列出了从 shell 操作文本文件的命令......
答案1
find
并且sed
是您选择的武器:
find /mydat/ -exec sed '1i 50' {} \;
它将保留50
在文件开头的新行。
或者,如果您不需要递归或复杂的选择器,find
您可以完全删除find
:
sed '1i 50' *
答案2
要编辑文件,您需要一个编辑器。ed
和ex
是基于命令的编辑器的示例,它们对于从脚本编辑文件很有用。以下是使用 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 代替\n
echo,如下所示。
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 的评论建议更新了脚本。