Как я могу разделить вывод с 2 разделителями?

Путем деления с "·" и "" символы, я хотел бы повернуть это:

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
задан 25 July 2015 в 07:48

3 ответа

$ 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·
5
ответ дан 3 December 2019 в 06:22

Я знаю, что у Вас уже есть очень хорошие ответы, но я люблю вопрос и не могу сопротивляться:

echo $sentence |
perl -C -ne 'do {print} while(s/(.*)[ ·].*/$1/)'
2
ответ дан 3 December 2019 в 06:22

В 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'

i.c.w.:

rules = [('|', 0)]

произведет:

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

но

s = 'This|is|a|string'

i.c.w.:

rules = [('|', 1)]

произведет:

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

Примечание:

Дополнительное len(s) к списку должен включать начальную строку в вывод.

1
ответ дан 3 December 2019 в 06:22

Другие вопросы по тегам:

Похожие вопросы: