我有一个相当复杂的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
分解是:
sed -n '/ # FirstMark/
(开始阅读此字符串)
,/# EndMark/p'
(停止阅读此字符串)
client_list.formal
(来自此文件)
grep -v "#"
(删除所有已注释掉的行)
awk -F\< '{print$2}'|awk-F\> '{print $1}'
(打印&lt;和&gt;之间的所有内容)
xargs|sed -e 's/ /,\ /g'|sort -u
(将所有内容放在同一行,添加逗号,然后排序为唯一)
最后一位应将所有输出写入新文件中指定行的末尾。
我目前的工作只是将其写入文件。然后我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
答案 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 );