到目前为止,我已经能够找出如何在文件的开头添加一行,但这并不完全是我想要的。我将用一个例子来说明:
文件内容
some text at the beginning
结果
<added text> some text at the beginning
它很相似,但是我不想用它创建任何新的行…
如果可能的话,我希望用sed来做这件事。
到目前为止,我已经能够找出如何在文件的开头添加一行,但这并不完全是我想要的。我将用一个例子来说明:
文件内容
some text at the beginning
结果
<added text> some text at the beginning
它很相似,但是我不想用它创建任何新的行…
如果可能的话,我希望用sed来做这件事。
当前回答
你可以用cat -
printf '%s' "some text at the beginning" | cat - filename
其他回答
只是为了好玩,这里有一个使用ed的解决方案,它没有不能处理空文件的问题。您可以把它放到一个shell脚本中,就像这个问题的任何其他答案一样。
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
上面的脚本将要插入的文本添加到第一行,然后连接第一行和第二行。为了避免ed在无效连接错误时退出,它首先在文件末尾创建一个空行,如果它仍然存在,则稍后删除它。
限制:如果<added text>恰好等于单个句点,此脚本将不起作用。
在文件顶部添加一行:
sed -i '1iText to add\'
如果文件只有一行,你可以使用:
sed 's/^/insert this /' oldfile > newfile
如果它不止一行。之一:
sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile
我已经包括了后者,以便您知道如何进行行范围。这两种方法都用要插入的文本“替换”受影响行的开始行标记。您还可以(假设您的sed足够现代)使用:
sed -i 'whatever command you choose' filename
进行就地编辑。
问题:标记一个文件,在文件的顶部,与父目录的基本名称。
例如,对
/mnt/Vancouver/Programming/file1
用Programming标记file1的顶部。
解决方案1——非空文件:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s将文本放在文件的第1行。
解决方案2——空文件或非空文件:
上面的sed命令在空文件上失败。下面是一个基于https://superuser.com/questions/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),并将其和文件cat到temp…请参见http://www.linfo.org/cat.html底部的解释。
我还在mv命令中添加了-f,以避免在覆盖文件时被要求确认。
递归遍历一个目录:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
还要注意,这将用空格分隔路径;有解决方案,在其他地方(例如文件通配符,或查找。-type f…-type解决方案)。
回复:我的最后一个评论,这个脚本将允许你递归在路径中有空格的目录:
#!/bin/bash
## https://stackoverflow.com/questions/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/"
# https://superuser.com/questions/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
别名是另一种解决方案。添加到你的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"