如何在文件的开头插入文本?

时间:2012-03-02 12:55:48

标签: linux bash sed

到目前为止,我已经能够找到如何在文件的开头添加一行,但这并不是我想要的。我将在一个例子中显示它

文件内容

some text at the beginning

结果

<added text> some text at the beginning

它很相似,但我不想用它创建任何新行......

如果可能的话,我想用sed执行此操作。

16 个答案:

答案 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