我有一个文本文件:
cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235
我想逐行将此文本添加到此文件中:
/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235
结果必须是:
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
我用了:
cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done
我可以使用什么命令来实现这一点?
我尝试使用sed
命令,但是没有用。
答案1
sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
解释
s/old/new/
old
用。。。来代替new
\/121.*
匹配/121
以及其后的内容&&
匹配的模式两次
您可以添加tee
或使用重定向保存到新文件
sed 's/\/121.*/&&/' test1 | tee test2
答案2
该paste
命令的作用cat
与并排命令相同。表示-d ''
使用paste
空分隔符,因此字符串之间没有任何内容。
$ paste -d '' test1 test2
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
如果文件长度不一致,你可能需要看看这个问题以避免出现难看的结果。
答案3
您还可以使用awk
:
$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
这里我将输入 ( -F"/"
) 和输出 ( -vOFS="/"
) 字段分隔符设置为/
。这意味着$2
将是/
第一个 之后直到下一个 的所有内容/
。由于每行只有一个/
,$2
是您要附加的文本。脚本将打印每一行 ( $0
),然后附加第二个字段 ( $2
)。
您也可以在 Perl 中使用相同的方法:
$ perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
或者,你可以使用与@Zanna 的sed
回答:
$ perl -pe 's#/.*#$&$&#' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235