sed附加到另一个文件中特定行的文件内容

时间:2015-10-22 13:48:08

标签: bash sed

我有一个相当复杂的sed脚本,它将文件的内容写入新文件中的单行逗号分隔列表中。

我想读取该文件并将其写入另一个文件的特定行的末尾。真正更好的是阅读原始文件,将逗号分隔列表直接写入新文件中的指定行,并跳过中间人。

sed -n '/# FirstMark/,/# EndMark/p' client_list.formal|grep -v "#"|awk -F\< '{print $2}'|awk -F\> '{print $1}'|xargs|sed -e 's/ /,\ /g'|sort -u|sed -i /writes all this stuff to end of specified line > file.txt

分解是:

  1. sed -n '/ # FirstMark/(开始阅读此字符串)

  2. ,/# EndMark/p'(停止阅读此字符串)

  3. client_list.formal(来自此文件)

  4. grep -v "#"(删除所有已注释掉的行)

  5. awk -F\< '{print$2}'|awk-F\> '{print $1}'(打印&lt;和&gt;之间的所有内容)

  6. xargs|sed -e 's/ /,\ /g'|sort -u(将所有内容放在同一行,添加逗号,然后排序为唯一)

  7. 最后一位应将所有输出写入新文件中指定行的末尾。

  8. 我目前的工作只是将其写入文件。然后我sed -i那个文件然后结束另一个文件的每一行(该文件只有一行。但是会有其他文件有多行,每行都有自己的列表,所有列表都是从一个文件构建的源文件。)

    到目前为止,我已经看到如何将其插入文件,特定行,将其附加到文件的末尾,但不是将其附加到指定行的末尾。我有没有想过这个?我觉得我已经想过这个了。

    示例client_list.formal

    # Formal Client Name1
    Contact Lastname,Firstname <email@address.tld>
    Contact Lastname,Firstname <email@address.tld>
    # Formal Client Name2
    Contact Lastname,Firstname <email@address.tld>

    写入的示例文件:

    email@address.tld,mail@address.tld,mail@address.tld,mail@address.tld,mail@address.tld

    要插入的示例文件:

    alias1: email@address.tld, email@address.tld, email@address.tld, email@address.tld
    alias2:
    alias3:email@address.tld, email@address.tld, email@address.tld, email@address.tld

    操作完成时预期的文件格式:

    alias1: email@address.tld, email@address.tld, email@address.tld, email@address.tld
    alias2: email@address.tld, email@address.tld, email@address.tld, email@address.tld,
    alias3: email@address.tld, email@address.tld, email@address.tld, email@address.tld

1 个答案:

答案 0 :(得分:0)

老实说 - 命令链足够大,我认为是时候打破像perl这样的编程语言了。

您尝试执行的任务可以完成 这样的事情:

#!/usr/bin/env perl

use strict;
use warnings;

#open your input file
open ( my $email_file, '<', 'client_list') or die $!;
#read all the lines with <email@somewhere>, and join them on a ','
my $address_list = join ( ",", map { m/<(.*)>/ } <$email_file> );
print "Inserting $address_list\n"; 
close ( $email_file ); 

#open filename     
open ( my $file2, '<', "insert_file_name" ) or die $!;
open ( my $results_file, '>', "output_file" ) or die $!;
#iterate file2.  
while ( my $line = <$file2> ) {
    # if condition matches, replace end of line with the address list above; 
    if ( $line =~ m/alias2/ ) { $line =~ s/$/$address_list/ };
    print {$results_file} $line;
}
close ( $file2 );
close ( $results_file );