Answers:
sed
可以在一个地址上运行:
$ sed -i '1s/^/<added text> /' file
1s
您在这里的每个答案中看到的神奇之处是什么?线路寻址!。
要添加<added text>
前10行吗?
$ sed -i '1,10s/^/<added text> /' file
或者您可以使用Command Grouping
:
$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
如果要在文件的开头添加一行,则需要\n
在上述最佳解决方案中的字符串末尾添加。
最好的解决方案是添加字符串,但使用字符串,则不会在文件末尾添加一行。
sed -i '1s/^/your text\n/' file
您可以使用 cat -
printf '%s' "some text at the beginning" | cat - filename
echo
添加换行符?
> file
到命令将其定向到文件中,它对我的终端发送了垃圾邮件"some text at the beginning"
printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename
要仅插入换行符:
sed '1i\\'
请注意,在OS X上sed -i <pattern> file
失败。但是,如果提供了备份扩展名sed -i old <pattern> file
,则file
在file.old
创建时会对其进行修改。然后file.old
,您可以在脚本中删除。
问题:在文件顶部用父目录的基本名称标记文件。
即,对于
/mnt/Vancouver/Programming/file1
标签的顶部file1
用Programming
。
解决方案1-非空文件:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
将文本放在文件的第1行。
解决方案2-空文件或非空文件:
sed
上面的命令在空文件上失败。这是一个基于/superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841的解决方案
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
请注意,-
cat命令中的是必需的(读取标准输入:man cat
有关更多信息,请参见)。我相信在这里,需要将printf语句的输出(发送至STDIN),并将该文件和该文件转换为temp ...另请参见http://www.linfo.org/cat底部的说明.html。
我还添加-f
了mv
命令,以避免在覆盖文件时被要求确认。
要遍历目录:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
还要注意,这将打破带有空格的路径;还有其他解决方案(例如文件遍历或find . -type f ...
-type解决方案)。
附录: 回复:我的最后一条评论,该脚本将允许您在路径中带有空格的目录上递归:
#!/bin/bash
## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi
## To allow spaces in filenames,
## at the top of the script include: IFS=$'\n'; set -f
## at the end of the script include: unset IFS; set +f
IFS=$'\n'; set -f
# ----------------------------------------------------------------------------
# SET PATHS:
IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"
# /superuser/716001/how-can-i-get-files-with-numeric-names-using-ls-command
# FILES=$(find $IN -type f -regex ".*/[0-9]*") ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*") ## recursive; numeric filenames only (may include spaces)
# echo '$FILES:' ## single-quoted, (literally) prints: $FILES:
# echo "$FILES" ## double-quoted, prints path/, filename (one per line)
# ----------------------------------------------------------------------------
# MAIN LOOP:
for f in $FILES
do
# Tag top of file with basename of current dir:
printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f
# Tag bottom of file with basename of current dir:
printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done
unset IFS; set +f
要将行添加到文件顶部:
sed -i '1iText to add\'
有一个很简单的方法:
echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
只是为了好玩,这里有一个解决方案ed
,它不存在无法处理空文件的问题。您可以像对待该问题的任何其他答案一样,将其放入shell脚本中。
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
上面的脚本将要插入的文本添加到第一行,然后连接第一行和第二行。为了避免ed因无效的连接而错误退出,它首先在文件末尾创建一个空行,然后在该行仍然存在的情况下将其删除。
局限性:如果该脚本<added text>
正好等于一个句点,则此脚本不起作用。
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt
第一个tac
将文件向后传递(最后一行在后),因此“要插入的文本”最后出现。2nd tac
再次包装它,因此插入的行在开头,原始文件按其原始顺序排列。
别名的另一种解决方案。添加到您的init rc / env文件中:
addtail () { find . -type f ! -path "./.git/*" -exec sh -c "echo $@ >> {}" \; }
addhead () { find . -type f ! -path "./.git/*" -exec sh -c "sed -i '1s/^/$@\n/' {}" \; }
用法:
addtail "string to add at the beginning of file"
addtail "string to add at the end of file"
sed
。