【问题标题】:I Want add some line in a file at linux我想在 linux 的文件中添加一些行
【发布时间】:2020-06-19 22:52:49
【问题描述】:

我有一个 linux centos 7 服务器,我希望下面的行以名称 config.xml 文件

<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>

我想在 config.xml 文件的第 8 行之后添加这一行

如何使用 sed 或 awk 命令?它的python或perl? 我搜索了很多,但对于我这个菜鸟来说很难,有人可以告诉我一些例子吗?

谢谢。

【问题讨论】:

  • 也许this可以帮助你。
  • sed 方法

标签: python linux perl centos7


【解决方案1】:

在 Python 中很容易:

to_add = """<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>
"""
with open("config.xml", "r") as f:
    all_lines = f.readlines()
with open("config.xml", "w") as f:
    for l in all_lines[:8]: f.write(l)
    f.write(to_add)
    for l in all_lines[8:]: f.write(l)

【讨论】:

  • 请注意这里有一个竞争条件。如果进程在第 2 次打开之后和最终写入完成之前终止,则可能会丢失数据。
  • @WilliamPursell 我能想到的唯一解决方法是写入一个临时文件,然后用临时文件替换原始文件,但这可能会使事情过于复杂。
  • 我刚刚这样做了:nano test.py 并在上面粘贴你的代码,然后使用 python test.py 运行它,然后我看到下面的输出: Traceback(最近一次调用最后一次):文件“test.py” py",第 9 行,在 f.write(all_lines[:8]) TypeError: expected a character buffer object
  • 对不起,我的错误。已更正。
  • @Błotosmętek 是的,现在可以了,谢谢,请问您为什么不使用 sed 或 awk 命令执行此操作?
【解决方案2】:

对我来说,使用 shell 命令执行此操作的最简单方法是显示原始 config.xml 的头部 8 行并将输出偏离到一个新文件。然后将新文件附加到您的代码中,最后包括从第 8 行开始的 config.xml 的尾部

$ head -n 8 config.xml > newconfig.xml
$ cat your_code.txt >> newconfig.xml
$ tail -n+8 config.xml >> newconfig.xml

最后你可以用 newfile 代替原来的 config.xml。做之前检查config.xml的内容!

$ mv newconfig.xml config.xml

【讨论】:

    【解决方案3】:

    在 perl 中可以通过多种方式轻松实现此类操作,请随意选择一种您认为合适的方式

    替代方法

    use strict;
    use warnings;
    use feature 'say';
    
    my $filename = 'config.xml';
    
    my $insert = 
    '<vhostMap>
      <vhost>google</vhost>
      <domain>google.com, www.google.com</domain>
    </vhostMap>';
    
    open my $fh, '<', $filename
        or die "Couldn't open $filename: $!";
    
    my $data = do{ local $/; <$fh> };
    
    close $fh;
    
    $data =~ s/((.*?\n){8})/${1}$insert\n/s;
    
    open $fh, '>', $filename
        or die "Couldn't open $filename: $!";
    
    say $fh $data;
    
    close $fh;
    

    数组切片方法

    use strict;
    use warnings;
    use feature 'say';
    
    my $filename = 'config.xml';
    
    my $insert = '<vhostMap>
      <vhost>google</vhost>
      <domain>google.com, www.google.com</domain>
    </vhostMap>';
    
    open my $fh, '<', $filename
        or die "Couldn't open $filename: $!";
    
    my @lines = <$fh>;
    
    close $fh;
    
    open $fh, '>', $filename
        or die "Couldn't open $filename: $!";
    
    say $fh @lines[0..7],$insert,"\n",@lines[8..$#lines];
    
    close $fh;
    

    数组迭代方法

    use strict;
    use warnings;
    use feature 'say';
    
    my $filename = 'config.xml';
    
    my $insert = '<vhostMap>
      <vhost>google</vhost>
      <domain>google.com, www.google.com</domain>
    </vhostMap>';
    
    open my $fh, '<', $filename
        or die "Couldn't open $filename: $!";
    
    my @lines = <$fh>;
    
    close $fh;
    
    open $fh, '>', $filename
        or die "Couldn't open $filename: $!";
    
    my $line_count = 0;
    
    for (@lines) {
        chomp;
        $line_count++;      
        say $fh $_; 
        say $fh $insert if $line_count == 8;
    }
    
    close $fh;
    

    输入

    line 1
    line 2
    line 3
    line 4
    line 5
    line 6
    line 7
    line 8
    line 9
    line 10
    line 11
    line 12
    

    输出

    line 1
    line 2
    line 3
    line 4
    line 5
    line 6
    line 7
    line 8
    <vhostMap>
      <vhost>google</vhost>
      <domain>google.com, www.google.com</domain>
    </vhostMap>
    line 9
    line 10
    line 11
    line 12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多