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

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

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

或者,如果您知道指向Web页面的链接,该页面列出了从shell处理文本文件的命令…

findsed是你的首选武器:

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

这将在文件开头粘贴50后跟一个新行。

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

 sed '1i 50' * 

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

 #!/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

基本上,您需要遍历目录中的每个文本文件,然后在开头添加一个小字符串。 将它分解为两个步骤并不难。

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

 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 

自从你问到, commandlinefu.com列出了一些在shell中使用的命令和技巧,它有很多关于文本文件操作的东西。

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

 #!/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的评论中的建议更新了脚本。