到目前为止,我已经能够找到如何在文件的开头添加一行,但这并不是我想要的。我将在一个例子中显示它
文件内容
some text at the beginning
结果
<added text> some text at the beginning
它很相似,但我不想用它创建任何新行......
如果可能的话,我想用sed
执行此操作。
答案 0 :(得分:269)
sed
可以在地址上运行:
$ sed -i '1s/^/<added text> /' file
你在这里的每个答案中看到的这个神奇的1s
是什么? Line addressing!
想在前10行添加<added text>
吗?
$ sed -i '1,10s/^/<added text> /' file
或者您可以使用Command Grouping
:
$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
答案 1 :(得分:28)
如果要在文件开头添加一行,则需要在上面最佳解决方案的字符串末尾添加\n
。
最好的解决方案是添加字符串,但是对于字符串,它不会在文件末尾添加一行。
sed -i '1s/^/your text\n/' file
答案 2 :(得分:26)
如果文件只有一行,您可以使用:
sed 's/^/insert this /' oldfile > newfile
如果它不止一行。其中之一:
sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile
我已经包含后者,以便你知道如何做行范围。这两个&#34;取代&#34;受影响的行上的起始行标记以及要插入的文本。您也可以(假设您的sed
足够现代)使用:
sed -i 'whatever command you choose' filename
进行就地编辑。
答案 3 :(得分:9)
您可以使用cat -
printf '%s' "some text at the beginning" | cat - filename
答案 4 :(得分:9)
仅插入换行符:
sed '1i\\'
答案 5 :(得分:5)
请注意,在OS X上,sed -i <pattern> file
失败。但是,如果您提供备用扩展程序sed -i old <pattern> file
,则会在创建file
时修改file.old
。然后,您可以在脚本中删除file.old
。
答案 6 :(得分:3)
问题:使用父目录的基本名称标记文件顶部的文件。
即,
/mnt/Vancouver/Programming/file1
使用file1
标记Programming
的顶部。
解决方案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),并将该文件和文件设置为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 ...
类型解决方案)。
ADDENDUM: Re:我的上一条评论,此脚本将允许您递归路径中包含空格的目录:
#!/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
答案 7 :(得分:3)
有一种非常简单的方法:
echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
答案 8 :(得分:2)
嗨回车:
sed -i '1s/^/your text\n/' file
答案 9 :(得分:2)
要在文件顶部添加一行:
sed -i '1iText to add\'
答案 10 :(得分:1)
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt
第一个tac
向后管道文件(最后一行),所以&#34;文本要插入&#34;出现在最后第二个tac
再次包装它,因此插入的行位于开头,原始文件按其原始顺序排列。
答案 11 :(得分:1)
只是为了好玩,这是一个使用ed
的解决方案,它没有处理空文件的问题。您可以像处理此问题的任何其他答案一样将其放入shell脚本中。
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
上面的脚本将要插入的文本添加到第一行,然后连接第一行和第二行。为避免ed出现无效连接错误,它首先在文件末尾创建一个空行,如果它仍然存在则将其删除。
限制:如果<added text>
完全等于单个句点,则此脚本无效。
答案 12 :(得分:1)
我的两分钱
sed -i '1i /path/of/file.sh' filename
即使包含正斜杠"/"
的字符串也可以使用
答案 13 :(得分:0)
使用子外壳:
echo "$(echo -n 'hello'; cat filename)" > filename
答案 14 :(得分:0)
另一个使用别名的解决方案。添加到您的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"
答案 15 :(得分:0)
使用echo
方法,如果您像我一样使用macOS / BSD,请输掉其他人建议的-n
开关。而且我想为文本定义一个变量。
所以会是这样:
Header="my complex header that may have difficult chars \"like these quotes\" and line breaks \n\n "
{ echo "$Header"; cat "old.txt"; } > "new.txt"
mv new.txt old.txt