我需要替换仅选择的250个erlang文件(扩展名为.erl)的前4个标题行,但目录+子目录中总共有400个erlang文件,我需要避免修改那些没有文件的文件。需要改变。 我是要修改的文件名列表,但不知道如何让我的linux命令使用它们。
sed -i '1s#.*#%% This Source Code Form is subject to the terms of the Mozilla Public#' *.erl
sed -i '2s#.*#%% License, v. 2.0. If a copy of the MPL was not distributed with this file,#' *.erl
sed -i '3s#.*#%% You can obtain one at http://mozilla.org/MPL/2.0/.#' *.erl
sed -i '4s#.*##' *.erl
在上面的命令中而不是传递* .erl我想传递那些我需要修改的文件名列表,逐个完成它将花费我超过3天的时间来完成它。
有没有办法做到这一点?
答案 0 :(得分:1)
使用awk
对列入名单的文件名进行迭代,并使用xargs
执行sed
。您可以使用sed
选项对文件执行多个-e
命令。
awk '{print $1}' your_shortlisted_file_lists | xargs sed -i -e first_sed -e second_sed $1
xargs
从awk
变量中获取$1
的文件名。
答案 1 :(得分:1)
试试这个:
< file_list.txt xargs -1 sed -i -e 'first_cmd' -e 'second_cmd' ...
答案 2 :(得分:1)
不回答您的问题,而是提出改进建议。用于替换标头的四个sed
命令效率低下。我会将新标题写入文件并执行以下操作
sed -i -e '1,3d' -e '4{r header' -e 'd}' file
将用标题替换文件的前四行。
您当前s###
方法的另一个问题是您必须在要替换的文本中注意特殊字符\
,&
和分隔符#
。
答案 3 :(得分:1)
您可以将sed c
(用于更改)命令应用于列表中的每个文件:
while read file; do
sed -i '1,4 c\
%% This Source Code Form is subject to the terms of the Mozilla Public\
%% License, v. 2.0. If a copy of the MPL was not distributed with this file,\
%% You can obtain one at http://mozilla.org/MPL/2.0/.\
' "$file"
done < filelist
答案 4 :(得分:0)
假设您有一个名为file_list.txt
的文件,其中所有文件名都是内容:
file1.txt
file2.txt
file3.txt
file4.txt
您可以简单地将所有行读入变量(此处:files
),然后遍历每一行:
files=`cat file_list.txt`
for file in $files; do
echo "do something with $file"
done