到目前为止,我已经能够找出如何在文件的开头添加一行,但这并不完全是我想要的。我将用一个例子来说明:

文件内容

some text at the beginning

结果

<added text> some text at the beginning

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

如果可能的话,我希望用sed来做这件事。


当前回答

如果你想在文件的开头添加一行,你需要在上面的最佳解决方案中在字符串的末尾添加\n。

最好的解决方案是添加字符串,但是使用字符串,它不会在文件的末尾添加一行。

sed -i '1s/^/your text\n/' file

其他回答

注意,在OS X上,sed -i <pattern>文件失败。但是,如果您提供了一个备份扩展名sed -i old <pattern> file,那么file将在file的位置被修改。旧的是创造出来的。然后您可以删除文件。老在你的剧本里。

嗨,用马车回:

sed -i '1s/^/your text\n/' file

有一个非常简单的方法:

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt

问题:标记一个文件,在文件的顶部,与父目录的基本名称。

例如,对

/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

博士 -

考虑使用ex。由于您想要给定行的前面,那么语法基本上与sed相同,但“就地编辑”选项是内置的。

我无法想象一个你有sed但没有ex/vi的环境,除非它是一个MS Windows盒子,有一些特殊的“sed.exe”,也许。

Sed和grep从ex / vi演变而来,所以说Sed语法与ex语法相同可能更好。

您可以将行号更改为#1以外的内容,或者搜索一行并更改该行。

source=myFile.txt
Front="This goes IN FRONT "
man true > $source
ex -s ${source} <<EOF
1s/^/$Front/ 
wq
EOF
$ head -n 3 $source
This goes IN FRONT TRUE(1)                                                    User Commands                                                    TRUE(1)

NAME

长的版本,我推荐ex(或者ed,如果你是一个很酷的孩子)。

我喜欢ex,因为它是可移植的,非常强大,允许我在不需要GNU(甚至BSD)扩展的情况下进行就地编写和/或备份。

此外,如果你知道ex的方法,那么你就知道如何在vi和vim中做它,如果那是你的专长的话。 注意,当我们使用"i"nsert和使用echo时,EOF没有被引用:

str="+++ TOP +++" && ex -s <<EOF
r!man true
1i
`echo "$str"`
.
"0r!echo "${str}"
wq! true.txt
EOF

0 r !Echo "${str}"也可以用作:0read!或:0 r !你可能在vi模式中使用过(实际上是一样的),但是:在这里是可选的,一些实现不支持“r”ead地址为零。 “r”直接读取到特殊的行#0(或从行1)会自动将所有内容“下”,然后只需:wq保存更改。

$ head -n 3 true.txt | nl -ba   
     1  +++ TOP +++
     2  TRUE(1)                          User Commands                         TRUE(1)
     3  

而且,大多数经典的sed实现都没有ex默认应该有的扩展(如\U&)。