从终端向文本文件添加字符串
我想从终端修改一堆文本文件,更准确:
将字符串’50’添加到/ mydat /中每个文本文件的第一行?
或者,如果您知道指向Web页面的链接,该页面列出了从shell处理文本文件的命令…
find
和sed
是你的首选武器:
find /mydat/ -exec sed '1i 50' {} \;
这将在文件开头粘贴50
后跟一个新行。
或者,如果您不需要递归或复杂的选择器来find
您可以完全删除:
sed '1i 50' *
要编辑文件,您需要一个编辑器。 ed
和ex
是基于命令的编辑器的示例,对于编辑脚本中的文件很有用。 这是一个示例,在/ 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的评论中的建议更新了脚本。