Unix:递归替换多行文本块的最简单方法

时间:2011-06-29 17:37:49

标签: linux unix sed awk replace

我想更改出现在数百个源文件顶部的许可文本。 这样做最简单的方法是什么?

编辑:以下是我想要做的事情的说明:

旧文件:

License 1:
xxxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
public class Foo
{



};

新文件:

License 2:
yyyyyyyyyyyyyy
yyyyyyyyyyyyyy
yyyyyyyyyyyyyy
yyyyyyyyyyyyyyy
public class Foo
{



};

因此,许可证后的文本应保持不变。

谢谢!

6 个答案:

答案 0 :(得分:1)

如果你能识别licence1中的最后一行,(所以当它不是一个空行时),你可以这样做,例如:

sed '1,/^the last line$/d' < $origfile | cat newlic.txt - > $newfile

答案 1 :(得分:0)

您可以尝试这样的事情:

newText="<your new license text>";

for file in <your files>
do
   sed '1,<number of lines of your old license text>d' $file |awk -v TEXT="$newText" 'BEGIN {print TEXT}{print}' > "${file}.tmp";
   mv "${file}.tmp" $file 
done

答案 2 :(得分:0)

您说您的“许可”文字出现在源文件的顶部。为此,您可以将旧许可证存储在一个文件中,将新许可证存储在另一个文件中。然后运行以下bash脚本。

dir=/home/priyank/temp/*.c #for all c files in the temp directory
for f in $dir
do
    filename=$f
    temp="$filename""__temp"
    cat new.txt > $temp #new.txt is new license
    v=`cat old.txt | wc -l`; #old.txt is old license
    awk '
    NR>'$v'{
    print $0 >> "'$temp'";
    }
    ' $filename
    rm $filename
    mv $temp $filename
done

bash script.sh运行此项。此外,请在尝试此脚本之前保存原始文件。它工作得很快。我把this作为文件,它工作得很好。切记不要在旧许可证文件中添加任何额外的新行。

答案 3 :(得分:0)

这是一个使用ed script.

的好地方

类似的东西:

for i in *.java; do
  ed $i << \eof
1,20d
0r newlicense.txt
w
q
eof
done

以一种检查旧许可证的方式包装它可能是一个好主意。您可以将其作为旧许可证中某行的grep条件,或者可以将1,20d更改为/first old line/;/last old line/d

之类的内容

答案 4 :(得分:0)

您需要使用此sed命令在文件顶部执行替换操作:

sed -i -n '/\(License\)/,/\(public class\)/{1h;1!H;/public class /{;g;s/\(License\).*\(public class \)/\1 2:\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyyyy\n\2/;p;};};/\(License\)/,/\(public class\)/!p' file.txt

现在以递归方式执行此操作,您可以将上面的内容与find结合使用(假设您在.txt文件中执行此操作):

find . -name "*.txt" -exec sed -i -n '/\(License\)/,/\(public class\)/{1h;1!H;/public class /{;g;s/\(License\).*\(public class \)/\1 2:\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyy\nyyyyyyyyyyyyyyyy\n\2/;p;};};/\(License\)/,/\(public class\)/!p' {} \;

答案 5 :(得分:-1)

我写了一个程序来做这个,我想如果有必要,我可以分享一些清理。我之前很聪明,有一个固定的许可证启动模式和许可证结束模式,但也许你可以模仿这个。

它处理行前缀,所以如果你的bash文件使用#views,你的C程序使用//,并且你的SQL使用 - ,它将使用适当的前缀(使用之前使用的任何东西)。 / p>

另一个技巧是使用©。有些文件是用UTF-8编码的,所以我可以使用©,其他文件用latin-1ish编码编码,所以我使用了latin-1字符,其他文件用普通的ascii编码,所以我使用了(c)。

最后一招是版权日期范围。版权所有©1997-2011。不同代的管理层想要不同的价值观。从公司开始到今年,从文件创建日期到今年,每年单独列出文件更新等。