Linux命令替换目录

时间:2016-04-12 06:00:22

标签: linux unix sed file-handling

我需要替换仅选择的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天的时间来完成它。

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:1)

使用awk对列入名单的文件名进行迭代,并使用xargs执行sed。您可以使用sed选项对文件执行多个-e命令。

awk '{print $1}' your_shortlisted_file_lists  | xargs sed -i -e first_sed -e second_sed $1

xargsawk变量中获取$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