如何在linux中的多个文件的开头添加多行?

时间:2017-04-13 20:22:23

标签: linux

我有一个文件beginning.txt,其中包含以下行:

Disclaimer Here
This is a Notice
I have something liere

如何执行linux命令将beginning.txt中的所有行添加到与扩展名“.customfile”匹配的每个文件的顶部(注意.customfile只是一个文本文件,但这些文件可能在子目录中)在我当前的文件夹中,我也想要更新)?

我有许多带有.customfile后缀的文件,我想要追加,所以寻找一种以编程方式执行此操作的方法。我看到sed命令的示例仅限于一行。

sed -i '1s/^/<added text> /' file

7 个答案:

答案 0 :(得分:7)

使用bash:

for file in $(find . -name "*.customfile"); do
  echo Processing $file

  cat beginning.txt $file > $file.modified

  mv $file.modified $file

done

答案 1 :(得分:1)

sed命令r在附加某个位置的文件内容时非常有用,除非该位置是第0行。

在第1行之前插入文本就像在第0行之后追加。如果允许sed '0r /path/to/beginning.txt *.customfile,那将是解决方案。

您可以将进程替换与sed一起使用。进程替换将生成sed命令,该命令可以针对您搜索的任何文件运行。

sed -i -f - file < <(sed 's/^/1i/' /path/to/beginning.txt)

流程sed 's/^/1i/' /path/to/beginning.txt将生成sed个命令,以插入/path/to/beginning.txt中找到的文字:

1iDisclaimer Here
1iThis is a Notice
1iI have something liere

sed -f -将从文件中读取sed命令,-表示文件为stdin

如果您需要在多个文件上运行它,您可以使用globs或findxargs

使用多个文件的示例:

sed -i -f - /path/to/*.customfile < <(sed 's/^/1i/' /path/to/beginning.txt)

使用find和xargs的示例:

find . -type f -name \*.customfile | xargs -I{} bash -c "sed -f - {} < <(sed 's/^/1i/' /tmp/beginning.txt)"

或者,您可以通过将输出分配给变量并使用此处字符串传递给sed 's/^/1i/' /path/to/beginning.txt命令来避免为每个文件重新运行sed

sedcommand=$(sed 's/^/1i/' /path/to/beginning.txt)
sed -i -f - /path/to/*.customfile <<< "$sedcommand"

或者从command.sed创建beginning.txt文件并使用它将文本插入自定义文件。

sed 's/^/1i/' /path/to/beginning.txt > /path/to/command.sed
sed -i -f /path/to/command.sed /path/to/*.customfile

答案 2 :(得分:0)

这是让你开始的东西,你只需要根据自己的喜好进行调整:

for i in *.customfile; do  sed -i '1s/^/<your_text> \n/' $i; done

答案 3 :(得分:0)

我想你可以尝试这样的事情

find . -name "*.customfile" -type f | while read i; do cat beginning.txt $i | tee $i 1>/dev/null ; done

也许不是tee命令最优雅的用法,但它完成了工作:)

答案 4 :(得分:0)

您有两个基本问题:

  1. 找到要更改的所有文件(*.customfile
  2. 将行添加到现有文件的开头
  3. 使用find可以轻松解决

    #1。 通过将行添加到临时文件,然后移动文件,可能最容易做到#2。

    这是一个单行shell命令,假设您要在名为beginning.txt的文件中添加行:

    find . -name "*.customfile" -print | while read fn ; do echo fixing $fn ; cat beginning.txt "$fn" > "$fn".new && mv "$fn" "$fn".old && mv "$fn".new "$fn" ; done

答案 5 :(得分:0)

虽然cat是适合这项工作的shell工具(参见:Robert的答案,我建议改为),如果你确实想用多行代替或插入来折磨自己在大量文件开头的免责声明文本中,您可以使用sed地址前缀来查找行的第一个开头,然后使用{{1执行替换使用免责声明文本将正则表达式 sed替换为第一行的开头(例如文件的开头)。

具体来说,您将使用'^'的{​​{1}}形式'0,addr2',其中sed正则表达式)匹配第一行输入,它导致addr2表单位于其范围的结尾,并替换(插入)替换文本一次并退出。

例如,要在0,addr2中的每个文件的开头添加免责声明(无论是使用通配还是files使用进程替换来选择所需的文件)将采取以下形式:

find

示例文件

## set disclaimer text in `dc` however you like
dc='Disclaimer Here\nThis is a Notice\nI have something liere\n'

## use 0,addr2 Address form to insert at beginning of each file.
sed -i "0,/^/s/^/${dc}/" files

示例使用/输出(以stdout为例

$ cat dat/basefile.txt
========
The quick brown fox
jumps over the lazy dog.

不要折磨自己,而是使用$ dc='Disclaimer Here\nThis is a Notice\nI have something liere\n' \ sed -e "0,/^/s/^/${dc}/" dat/basefile.txt Disclaimer Here This is a Notice I have something liere ======== The quick brown fox jumps over the lazy dog. 代替......

答案 6 :(得分:0)

这是另一个没有tmp-File的小解决方案(只有起始文本在一个文件中)

for i in ``ls *.customfile``; do echo -e "``cat prepend.txt``$(cat $i)" > $i; done

请用正常的双反推替换,我不知道如何在这里显示正常的反推。

如果您不想要文件 prepend.txt ,可以在文本后面用“\ n”替换cat-command。