用sed替换bash中字符串的一部分

时间:2018-04-14 10:57:07

标签: bash unix

在bash中,假设我有输入:

ATGTGSDTST

我要打印:

AT
ATGT
ATGTGSDT
ATGTGSDTST

这意味着我需要查找所有以'T'结尾的子串并打印它们。 我以为我应该在for循环中使用sed,但我不明白在这种情况下如何正确使用sed。 有帮助吗? 感谢

2 个答案:

答案 0 :(得分:0)

以下脚本使用sed

#!/usr/bin/env bash

pattern="ATGTGSDTST"                                                        
sub="T"
# Get number of T in $pattern:
num=$(grep -o -n "T" <<< "$pattern" | cut -d: -f1 | uniq -c | grep -o "[0-9]\+ ")                                                        
i=1                                                                         
text=$(sed -n "s/T.*/T/p" <<< "$pattern")                                   
echo $text                                                                  

while [ $i -lt $num ]; do                                                   
    text=$(sed -n "s/\($sub[^T]\+T\).*/\1/p" <<< "$pattern")                
    sub=$text                                                               
    echo $text                                                              
    ((i++))                                                                 
done          

给出输出:

AT
ATGT
ATGTGSDT
ATGTGSDTST

答案 1 :(得分:0)

不需要sed,只需使用参数扩展:

#! /bin/bash
string=ATGTGSDTST
length=${#string}
prefix=''

while (( ${#prefix} != $length ))  ; do
    sub=${string%%T*}
    sub+=T
    echo $prefix$sub
    string=${string#$sub}
    prefix+=$sub
done