如何用 2 个分隔符划分输出?

Tux*_*ife 1 python regex perl sed awk

通过除以“·”和“”字符,我想把这个:

Hel·lo my name is E·ric
Run Code Online (Sandbox Code Playgroud)

对此:

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·
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*024 6

$ 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·
Run Code Online (Sandbox Code Playgroud)

多行版本

对于那些喜欢他们的代码分布在多行上的人:

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
    }
}'
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • -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 循环的结束。

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