sed将部分行复制到结尾

时间:2017-09-12 08:31:57

标签: sed text-processing

我正在尝试复制部分行以追加到最后:

ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1_IonXpress_024_genomic.fna.gz

变为:

ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1/GCA_900169985_IonXpress_024_genomic.fna.gz

我试过了:

sed 's/\(.*(GCA_\)\(.*\))/\1\2\2)'

2 个答案:

答案 0 :(得分:0)

$ f1=$'ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1_IonXpress_024_genomic.fna.gz'

$ echo "$f1"
ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1_IonXpress_024_genomic.fna.gz

$ sed -E 's/(.*)(GCA_.[^.]*)(.[^_]*)(.*)/\1\2\3\/\2\4/' <<<"$f1"
ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1/GCA_900169985_IonXpress_024_genomic.fna.gz

sed -E(或某些系统中的-r)可以在sed中启用扩展的正则表达式支持,因此您无需转义组括号( )

格式(GCA_.[^.]*)等于“从GCA_获取所有字符并排除第一个找到的点”:

$ sed -E 's/(.*)(GCA_.[^.]*)(.[^_]*)(.*)/\2/' <<<"$f1"
GCA_900169985

同样(.[^_]*)表示将所有字符设置为首先找到_(不包括_字符)。这是执行非贪婪/惰性捕获的正则表达方式(在perl正则表达式中,这可能类似于.*_?

$ sed -E 's/(.*)(GCA_.[^.]*)(.[^_]*)(.*)/\3/' <<<"$f1"
.1

答案 1 :(得分:0)

sed 方法:

s="ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1_IonXpress_024_genomic.fna.gz"
sed -E 's/(GCA_[^._]+)\.([^_]+)/\1.\2\/\1/' <<< "$s"

输出:

ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/900/169/985/GCA_900169985.1/GCA_900169985_IonXpress_024_genomic.fna.gz