我有一个文件beginning.txt包含如下行:
Disclaimer Here This is a Notice I have something liere
我怎样才能执行一个linux命令,将所有在begin.txt中的行添加到与扩展名“.customfile”匹配的每个文件的顶部(注意.customfile只是一个文本文件,但是这些文件可能在我当前的子目录中我也想更新的文件夹)?
我有很多带有.customfile后缀的文件,我想追加,所以寻找一种方法来编程。 我看到sed命令的例子,似乎限于一行。
sed -i '1s/^/<added text> /' file
用bash:
for file in *.customfile; do echo Processing $file cat beginning.txt $file > $file.modified mv $file.modified $file rm $file.modified done
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或find
和xargs
。
使用多个文件的示例:
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"
或者从beginning.txt
创建一个command.sed
文件,并使用它将文本插入到自定义文件中。
sed 's/^/1i/' /path/to/beginning.txt > /path/to/command.sed sed -i -f /path/to/command.sed /path/to/*.customfile
这里是让你开始的东西,你只需要按照自己的喜好调整它:
for i in *.customfile; do sed -i '1s/^/<your_text> \n/' $i; done
你有两个基本的问题:
*.customfile
) 找到#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
我想你可以尝试这样的事情
find . -name "*.customfile" -type f | while read i; do cat beginning.txt $i | tee $i 1>/dev/null ; done
也许不是T恤命令最优雅的用法,但是它完成了工作:)
虽然cat
是这项工作的合适工具(见:罗伯特的答案,我会建议),如果你想折磨自己的多行替换或插入免责声明文本在大量的开始文件,你可以使用地址前缀为sed
找到一行的第一个开头,然后用sed
替换第一行的开头(例如文件的开始)使用免责声明文本的正则表达式 '^'
替换。
具体来说,你将使用地址的'0,addr2'
形式为sed
,如果addr2
(一个正则表达式 )匹配输入的第一行,它会导致0,addr2
形式在其范围的末尾,并替换(插入)替换文本一次并退出。
例如,要在files
的每个文件的开头添加免责声明(无论是使用globbing还是使用流程替换 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
示例文件
$ cat dat/basefile.txt ======== The quick brown fox jumps over the lazy dog.
示例使用/输出(以stdout为例
$ 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.
而不是折磨自己,用cat
来代替…
这里是另一个小的解决方案没有tmp文件(只有开始文本在一个文件中)
for i in ``ls *.customfile``; do echo -e "``cat prepend.txt``$(cat $i)" > $i; done
请替换正常的双反引号,我不知道如何在这里显示正常反引号。
如果你不想要文件prepend.txt,你可以在文本后用带有“\ n”的行代替cat-command。