如何使用两个分隔符来划分输出?

如何使用两个分隔符来划分输出?

通过用“·”和“ ”字符进行划分,我想将其转换为:

Hel·lo my name is E·ric

对此:

Hel·lo my name is E·ric
Hel·lo my name is E·
Hel·lo my name is
Hel·lo my name
Hel·lo my
Hel·lo
Hel·

下面的代码几乎可以做到这一点,但我不太确定需要调整什么才能保留音节点。

sentence="Hel·lo my name is E·ric"
echo $sentence | awk -F'[· ]' -v OFS=" " '{print;for (i=NF;i>1;i--){$i="";print;NF--} }'

答案1

$ echo $sentence | awk -F'[· ]' '{out=$0;print;for (i=NF;i>1;i--){out=gensub(/([· ])[^· ]*[· ]?$/, "\\1", "g", out); print out }}'
Hel·lo my name is E·ric
Hel·lo my name is E·
Hel·lo my name is 
Hel·lo my name 
Hel·lo my 
Hel·lo 
Hel·

多行版本

对于那些喜欢将代码分布在多行上的人来说:

sentence="Hel·lo my name is E·ric"
echo $sentence | awk -F'[· ]' '{
    out=$0
    print
    for (i=NF;i>1;i--){
        out=gensub(/([· ])[^· ]*[· ]?$/, "\\1", "g", out)
        print out
    }
}'

怎么运行的

  • -F'[· ]'告诉 awk 在任何出现·或空格处分隔字段。

  • {标记此行处理组的开始。

  • out=$0告诉 awk 将当前行(在 awk 中称为 )保存$0在变量中out

  • print打印当前行。

  • for (i=NF;i>1;i--){启动一个循环,对输入行中的字段数进行倒计时。每次执行循环时:

    • out=gensub(/([· ])[^· ]*[· ]?$/, "\\1", "g", out)从行尾删除一个字段(包括任何前面或后面的字段分隔符),并将结果文本保存在变量中out

    • print out打印变量的内容out

  • }标记 for 循环的结束。

  • }标记此行处理组的结束

答案2

我知道你已经有了很好的答案,但我喜欢这个问题,无法抗拒:

echo $sentence |
perl -C -ne 'do {print} while(s/(.*)[ ·].*/$1/)'

答案3

在python中:

由于两个分隔符的拆分定义并不完全相同(需要包含点,而不需要空格),因此需要两个步骤来拆分:

用(长)一行代码来说:

python3 -c "s = open('f').read().strip(); [print(s[:n]) for n in reversed(sorted([i+1 for i, c in enumerate(s) if s[i] == '·']+[i for i, c in enumerate(s) if s[i] == ' ']+[len(s)]))]"

其中 ' f' 是文件的路径,位于(单)引号之间。

或者更具可读性,在脚本中:

#!/usr/bin/env python3

# read the file
s = open("f").read().strip()
# find the indexes of the character "·" in the line, add 1 to include the dot
n1 = [i+1 for i, c in enumerate(s) if s[i] == "·"]
# find the indexes of spaces in the line
n2 = [i for i, c in enumerate(s) if s[i] == " "]
# combine and sort the found indexes, print the line up to each of the indexes
[print(s[:n]) for n in reversed(sorted(n1+n2)+[len(s)])]

为了完全匹配您的示例,找到的索引按从最后一个索引到第一个索引的反向排序。

在这两种情况下(正如预期),结果是:

Hel·lo my name is E·ric
Hel·lo my name is E·
Hel·lo my name is
Hel·lo my name
Hel·lo my
Hel·lo
Hel·

编辑

更复杂一点(也更灵活)的做法是:

#!/usr/bin/env python3
# read the file
s = open('f').read().strip()
#--- set your delimiter(s) + the split rules below in the format rules = [(<character>, <additional_index>)]
rules = [('·', 1), (' ', 0)]
#---
[print(s[:n]) for n in [len(s)]+sorted(sum([[i+r[1] for i, c in enumerate(s) if s[i] == r[0]] for r in rules], []))[::-1]]

这使您可以“自由”地轻松添加更多分隔符并设置规则以在拆分字符串中包含或不包含字符。

例如

s = 'This|is|a|string'

国际妇女节:

rules = [('|', 0)]

将输出:

This|is|a|string
This|is|a
This|is
This

s = 'This|is|a|string'

国际妇女节:

rules = [('|', 1)]

将输出:

This|is|a|string
This|is|a|
This|is|
This|

笔记

列表的附加内容len(s)是在输出中包含初始行。

相关内容