我想改變:
e·ver·y·bo·dy
到:
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
循環for
將是非常優選的。
答案1
這也使用了for
循環,儘管是 awkfor
循環:
$ echo "e·ver·y·bo·dy" | awk -F· -v OFS=· '{print;for (i=NF;i>1;i--){$i="";print;NF--} }'
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
從短到長的替代版本
$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{for (i=1;i<=NF;i++){for (j=1;j<=i;j++)printf "%s%s",$j,j<NF?OFS:"";print""} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
另一種變化
$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{s="";for (i=1;i<=NF;i++){s=s OFS $i; printf "%s",substr(s,2); print (i==NF)?"":OFS} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
答案2
你可以用更短的時間來做awk命令如下(長到小):
$ awk -F'·' '{while (NF){ print $0;NF--;ORS="·\n"}}' OFS='·' file
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·
並從小到長如下:
$ awk -F'·' '{i=1; while(i<NF){ print tmp=tmp$((i++))"·"} print $0}' file
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
答案3
如果它必須是一個for
循環:
IFS=·
for l in $(echo "e·ver·y·bo·dy"); do x="$x$l·"; echo "$x"; done | tac
首先我們必須設定內部文件分隔符到·
。然後 for 循環遍歷每個和平並列印它,但順序錯誤。這就是為什麼tac
最後顛倒了順序。
給我輸出:
e·ver·y·bo·dy·
e·ver·y·bo·
e·ver·y·
e·ver·
e·
答案4
這是一個python
解決方案:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
input_str = 'e·ver·y·bo·dy'
input_list = input_str.split('·')
print input_str
i = len(input_list)
while i > 1:
print '·'.join(input_list[:i-1]) + '·'
i -= 1
在這裡,我們首先split
使用輸入字串·
作為分隔符號來產生列表,然後使用列表切片並join
獲得所需的輸出。