Sed 从多个文件位置在匹配后追加文本

Sed 从多个文件位置在匹配后追加文本,sed,Sed,说到编码,我是个笨蛋,所以请容忍我。。。我正在尝试编写一个脚本,将3个独立文件中的数据输入文本文件中的3个特定位置,例如: 编辑以便于阅读 #start of script start_of_line1_text "$1" end_of_line1_text start_of_line2_text "$2" end_of_line2_text start_of_line3_text "$3" end_of_line3_text #output to text when done $1 i

说到编码,我是个笨蛋,所以请容忍我。。。我正在尝试编写一个脚本,将3个独立文件中的数据输入文本文件中的3个特定位置,例如: 编辑以便于阅读

#start of script
start_of_line1_text "$1" end_of_line1_text
start_of_line2_text "$2" end_of_line2_text
start_of_line3_text "$3" end_of_line3_text
#output to text when done   

$1 is the value in text1
$2 is the value in text2
$3 is the value in text3
我正在考虑使用sed,但不太清楚如何做到这一点

或者在匹配随机文本后插入一个1美元的单词?即:

sed '/start_of_line1_text/ a middle_of_line1_text' input
同样在更大的范围内-如果text1、2和3中有多个值,您如何一次导入1个值并每次保存一个新文件?例如:

text1 = 
a
b
c

text2 = 
e
f
g

text3 = 
h
i
j


#start of script
start_of_line1_text "line one of text1" end_of_line1_text
start_of_line2_text "line one of text2" end_of_line2_text
start_of_line3_text "line one of text3" end_of_line3_text
#output to text when done   
然后:

#start of script
start_of_line1_text "line two of text1" end_of_line1_text
start_of_line2_text "line two of text2" end_of_line2_text
start_of_line3_text "line two of text3" end_of_line3_text
#output to text when done   
我对所使用的语言并不挑剔,我只是有点纠结于如何将这些结合在一起


非常感谢

这个问题非常适合
awk

尝试一下:

awk '!f[FNR] {f[FNR]=("out" FNR ".txt"); print "#start of script" >f[FNR]} {print "random_text \"" $0 "\" some_other_text" >f[FNR]} END {for(n in f) print "#output to text when done">f[n]}' text1 text2 text3
输出文件在当前目录
out1.txt
out2.txt
等中生成

可以在命令末尾提供任意数量的文本文件作为输入

下面是包含其他参数的脚本文件版本:

#!/usr/bin/awk -f
!f[FNR] {
  f[FNR]=("out" FNR ".txt")
  print first >f[FNR]
}
{ 
  print start $0 end >f[FNR]
}
END {
  for(n in f) print last>f[n]
}
测试:

chmod +x ./script.awk
./script.awk -v first="#start of script"                          \
             -v start="random_text \"" -v end="\" some_other_text"\
             -v last="#output to text when done"                  \
             text1 text2 text3

这个问题非常适合
awk

尝试一下:

awk '!f[FNR] {f[FNR]=("out" FNR ".txt"); print "#start of script" >f[FNR]} {print "random_text \"" $0 "\" some_other_text" >f[FNR]} END {for(n in f) print "#output to text when done">f[n]}' text1 text2 text3
输出文件在当前目录
out1.txt
out2.txt
等中生成

可以在命令末尾提供任意数量的文本文件作为输入

下面是包含其他参数的脚本文件版本:

#!/usr/bin/awk -f
!f[FNR] {
  f[FNR]=("out" FNR ".txt")
  print first >f[FNR]
}
{ 
  print start $0 end >f[FNR]
}
END {
  for(n in f) print last>f[n]
}
测试:

chmod +x ./script.awk
./script.awk -v first="#start of script"                          \
             -v start="random_text \"" -v end="\" some_other_text"\
             -v last="#output to text when done"                  \
             text1 text2 text3
到目前为止,我得到的是:

#!/usr/bin/perl

use strict;
use warnings;

sub rtrim { my $s = shift; $s =~ s/\s+$//;       return $s };

sub read_file_line {
my $fh = shift;

if ($fh and my $line = <$fh>) {
chomp $line;
return [split(/\t/,$line)];
}
return;
}

open(my $f1, "file1.txt");
open(my $f2, "file2.txt");
open(my $f3, "file3.txt");
open(FILE, ">group.txt") or die "Cannot open file";

my $pair1 = read_file_line($f1);
my $pair2 = read_file_line($f2);
my $pair3 = read_file_line($f3);

while ($pair1 and $pair2 and $pair3) {

printf '%s,',$pair1->[0] ;
printf "%s\n",$pair2->[0] ;
printf '%s,',$pair3->[0] ;

printf FILE " line1_text\n" ;
printf FILE " line2_text\n" ;
printf FILE " line3_text\n" ;
printf FILE " start_of_line4_text\"%s\end_of_line4_text\n",$pair3->[0] ;
printf FILE " start_of_line5_text\"%s\end_of_line5_text\n",$pair2->[0] ;
printf FILE " start_of_line6_text\"%s\end_of_line6_text\n",rtrim($pair1->[0]) ;
printf FILE " line7_text\n" ;
printf FILE " line8_text\n\n\n" ;



$pair1 = read_file_line($f1);
$pair2 = read_file_line($f2);
$pair3 = read_file_line($f3);

}

close($f1);
close($f2);
close($f3);
close(FILE) ;
#/usr/bin/perl
严格使用;
使用警告;
sub-rtrim{my$s=shift;$s=~s/\s+$/;return$s};
子读取文件行{
我的$fh=班次;
如果($fh和我的$line=){
chomp$行;
返回[拆分(/\t/,$line)];
}
返回;
}
打开(my$f1,“file1.txt”);
打开(my$f2,“file2.txt”);
打开(my$f3,“file3.txt”);
打开(文件“>group.txt”)或死“无法打开文件”;
my$pair1=读取文件行($f1);
my$pair2=读取文件行($f2);
my$pair3=读取文件行($f3);
而($pair1和$pair2和$pair3){
printf“%s”,$pair1->[0];
printf“%s\n”,$pair2->[0];
printf'%s',$pair3->[0];
printf文件“line1\u text\n”;
printf文件“line2\u text\n”;
printf文件“line3\u text\n”;
printf文件“第4行的开始\u文本\%s\end\u第4行的结束\u文本\%n”$pair3->[0];
printf文件“\u行5\u文本的开始\u\%s\u行5\u文本的结束\n”$pair2->[0];
printf文件“第6行的开始\u文本\%s\结束\u第6行的结束\u文本\%n”,rtrim($pair1->[0]);
printf文件“line7\u text\n”;
printf文件“line8\u text\n\n\n”;
$pair1=读取文件行($f1);
$pair2=读取文件行($f2);
$pair3=读取文件行($f3);
}
关闭(f1美元);
收盘价(f2美元);
收盘价(f3美元);
关闭(文件);
到目前为止,我得到的是:

#!/usr/bin/perl

use strict;
use warnings;

sub rtrim { my $s = shift; $s =~ s/\s+$//;       return $s };

sub read_file_line {
my $fh = shift;

if ($fh and my $line = <$fh>) {
chomp $line;
return [split(/\t/,$line)];
}
return;
}

open(my $f1, "file1.txt");
open(my $f2, "file2.txt");
open(my $f3, "file3.txt");
open(FILE, ">group.txt") or die "Cannot open file";

my $pair1 = read_file_line($f1);
my $pair2 = read_file_line($f2);
my $pair3 = read_file_line($f3);

while ($pair1 and $pair2 and $pair3) {

printf '%s,',$pair1->[0] ;
printf "%s\n",$pair2->[0] ;
printf '%s,',$pair3->[0] ;

printf FILE " line1_text\n" ;
printf FILE " line2_text\n" ;
printf FILE " line3_text\n" ;
printf FILE " start_of_line4_text\"%s\end_of_line4_text\n",$pair3->[0] ;
printf FILE " start_of_line5_text\"%s\end_of_line5_text\n",$pair2->[0] ;
printf FILE " start_of_line6_text\"%s\end_of_line6_text\n",rtrim($pair1->[0]) ;
printf FILE " line7_text\n" ;
printf FILE " line8_text\n\n\n" ;



$pair1 = read_file_line($f1);
$pair2 = read_file_line($f2);
$pair3 = read_file_line($f3);

}

close($f1);
close($f2);
close($f3);
close(FILE) ;
!/usr/bin/perl
严格使用;
使用警告;
sub-rtrim{my$s=shift;$s=~s/\s+$/;return$s};
子读取文件行{
我的$fh=班次;
如果($fh和我的$line=){
chomp$行;
返回[拆分(/\t/,$line)];
}
返回;
}
打开(my$f1,“file1.txt”);
打开(my$f2,“file2.txt”);
打开(my$f3,“file3.txt”);
打开(文件“>group.txt”)或死“无法打开文件”;
my$pair1=读取文件行($f1);
my$pair2=读取文件行($f2);
my$pair3=读取文件行($f3);
而($pair1和$pair2和$pair3){
printf“%s”,$pair1->[0];
printf“%s\n”,$pair2->[0];
printf'%s',$pair3->[0];
printf文件“line1\u text\n”;
printf文件“line2\u text\n”;
printf文件“line3\u text\n”;
printf文件“第4行的开始\u文本\%s\end\u第4行的结束\u文本\%n”$pair3->[0];
printf文件“\u行5\u文本的开始\u\%s\u行5\u文本的结束\n”$pair2->[0];
printf文件“第6行的开始\u文本\%s\结束\u第6行的结束\u文本\%n”,rtrim($pair1->[0]);
printf文件“line7\u text\n”;
printf文件“line8\u text\n\n\n”;
$pair1=读取文件行($f1);
$pair2=读取文件行($f2);
$pair3=读取文件行($f3);
}
关闭(f1美元);
收盘价(f2美元);
收盘价(f3美元);
关闭(文件);

我努力想理解你想做什么,但我不明白。看起来你混合了伪代码和输入/输出;此外,文本过于简化。每一行都是一样的吗?可能不会。你可以通过更清楚地说明你想要发生什么,分离(伪)代码和输入/输出,并展示你迄今为止所做的尝试来改进这个问题。我试图理解你想要做什么,但我不明白。看起来你混合了伪代码和输入/输出;此外,文本过于简化。每一行都是一样的吗?可能不会。您可以通过更清楚地说明您希望发生什么,分离(伪)代码和输入/输出,并展示您迄今为止所做的尝试来改进这个问题。