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

2024-10-12 11:51:00
admin
原创
273
摘要:问题描述:到目前为止,我已经能够找到如何在文件开头添加一行,但这并不是我想要的。我将通过一个例子来展示它:文件内容some text at the beginning 结果<added text> some text at the beginning 它很相似,但我不想用它创建任何新的线路...

问题描述:

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

文件内容

some text at the beginning

结果

<added text> some text at the beginning

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

如果可能的话我想这么做sed


解决方案 1:

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,}

解决方案 2:

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

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

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

解决方案 3:

如果文件只有一行,可以使用:

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

进行就地编辑。

解决方案 4:

使用子shell:

echo "$(echo -n 'hello'; cat filename)" > filename

不幸的是,命令替换将删除文件末尾的换行符。为了保留它们,可以使用:

echo -n "hello" | cat - filename > /tmp/filename.tmp
mv /tmp/filename.tmp filename

不需要分组,也不需要命令替换。

解决方案 5:

仅插入换行符:

sed '1i\\'

解决方案 6:

您可以使用cat -

printf '%s' "some text at the beginning" | cat - filename

解决方案 7:

我的看法:

sed -i '1i /path/of/file.sh' filename

/path/of/file.sh您要添加的文本在哪里。

即使字符串包含正斜杠,此方法也能起作用"/"

解决方案 8:

要在文件顶部添加一行:

sed -i '1iText to add\'

解决方案 9:

嗨,回车:

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

解决方案 10:

请注意,在 OS X 上,sed -i <pattern> file会失败。但是,如果您提供备份扩展,sed -i old <pattern> file,则会在创建file时就地修改。然后您可以在脚本中删除。file.old`file.old`

解决方案 11:

有一个非常简单的方法:

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

解决方案 12:

问题:在文件顶部用父目录的基本名称标记文件。

/mnt/Vancouver/Programming/file1

file1用标记 的顶部Programming

解决方案 1——非空文件:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'
/' <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##*/}
" | cat - <file> > temp && mv -f temp <file>

请注意,-cat 命令中的 是必需的(读取标准输入:有关详细信息,请参阅)。我认为,这里需要获取 printf 语句的输出(到 STDIN),并将其和文件 cat 到 temp ... 另请参阅http://www.linfo.org/cat.htmlman cat底部的说明。

我还添加了-f命令mv,以避免在覆盖文件时被要求确认。

要对目录进行递归:

for file in *; do printf "${PWD##*/}
" | cat - $file > temp && mv -f temp $file; done

还要注意,这将破坏带有空格的路径;对于这些问题,在其他地方有解决方案(例如文件通配符或find . -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=$'
'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'
'; 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##*/}

" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "
[bottom] Tag: ${PWD##*/}
" >> $f
done

unset IFS; set +f

解决方案 13:

只是为了好玩,这里有一个解决方案ed,它不会出现无法处理空文件的问题。您可以像这个问题的任何其他答案一样将其放入 shell 脚本中。

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

上述脚本将要插入的文本添加到第一行,然后连接第一行和第二行。为了避免 ed 因无效连接而退出,它首先在文件末尾创建一个空白行,然后如果仍然存在则将其删除。

限制:<added text>如果正好等于一个句点,则此脚本不起作用。

解决方案 14:

我发现的最简单的解决方案是:

echo -n "<text to add>" | cat - myFile.txt | tee myFile.txt

笔记:

  • | tee myFile.txt如果不想更改文件内容,请删除。

  • -n如果要附加整行,请删除该参数。

  • &> /dev/null如果您不想看到输出(生成的文件),请添加到末尾。

  • 这可用于将 shebang 附加到文件。例如:

# make it executable (use u+x to allow only current user)
chmod +x cropImage.ts
# append the shebang
echo '#''!'/usr/bin/env ts-node | cat - cropImage.ts | tee cropImage.ts &> /dev/null
# execute it
./cropImage.ts myImage.png

解决方案 15:

echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

第一个tac命令将文件反向排列(最后一行在前),这样“要插入的文本”就会出现在最后。第二个命令tac再次换行,这样插入的行就会出现在开头,而原始文件仍按其原始顺序排列。

解决方案 16:

cat连接多个文件。<()将命令的输出作为文件发送。使用 -n 开关时,echo 不会添加新行。使用 -c 开关的 head 命令可以删除文件中的尾随换行符。结合所有这些,我们可以在文件的开头和结尾插入文本,而无需任何换行符,

cat <(echo -n "line before the file") <(head -c -1 file.txt) <(echo -n "line after the file")

解决方案 17:

感谢以上所有最佳答案,仅提供一点提示:

对于sed方法,如果您想在转到换行符时传递变量,就像我想要对我的/etc/hosts文件执行的操作一样,请不要忘记使用双引号"

`sed -i "1s/^/127.0.0.1 $HOSTNAME
/" /etc/hosts`

解决方案 18:

另一个解决方案是使用别名。添加到您的 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/^/$@
/' {}" ; }

用法:

addtail "string to add at the beginning of file"
addtail "string to add at the end of file"

解决方案 19:

使用这种echo方法,如果你和我一样使用 macOS/BSD,就不用-n像其他人建议的那样使用 switch 了。我喜欢为文本定义一个变量。

因此它会是这样的:

Header="my complex header that may have difficult chars \"like these quotes\" and line breaks 

 "

{ echo "$Header"; cat "old.txt"; } > "new.txt"
mv new.txt old.txt

解决方案 20:

总结

考虑使用ex。由于您想要给定行的开头,因此语法基本上与您可能找到的语法相同,sed但“就地编辑”选项是内置的。

我无法想象有sed但没有ex/ 的环境vi,除非它是一个带有某些特殊“sed.exe”的 MS Windows 机器。

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这就是你的难题。请注意,EOF当我们使用“i”nsert 并使用时,不会引用echo

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

0r!echo "${str}"也可能用作:0read!或的简写,您可能在模式:0r!中使用过(它实际上是同一件事),但这里是可选的,并且一些实现不支持“读”地址为零。直接“读”到特殊行#0(或从第 1 行)会自动将所有内容“向下”推,然后您只需保存更改。vi`:`:wq

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

此外,大多数经典sed实现并没有默认应该有的扩展(如U&) 。ex

解决方案 21:

find . -name "*prod*" -exec sed -i '1iline1
  Line2
     Line3
' {} ;

我用它来解决这个问题。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   27  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   22  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   19  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用