Извлечение нескольких строк в одну строку между двумя типами символов

Похоже, в вашей системе заканчивается свободная оперативная память и происходит подкачка. При возникновении проблемы проверьте вывод free -h. Кроме того, программы мониторинга системы, такие как htopи atop, могут предоставить более широкий обзор текущей загрузки системы.

0
06.10.2019, 01:54
3 ответа

Это будет работать с версией sed для gnu (по умолчанию на каждом Linux)

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@' | sed 's/#\([^@]*\)@/\1\n/g'

дай мне

HelloMyName
IsAdam
NiceToMeetYou

На макосах

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@' | sed 's/#\([^@]*\)@/\1\'$'\n''/g'

Это примеры с эхом, то же самое будет работать с файлами.

echo -n '#HelloMyName@#IsAdam@#NiceToMeetYou@'  > input.txt

sed 's/#\([^@]*\)@/\1\n/g' input.txt > sequence.txt
1
28.04.2021, 23:28

В GNU awk(gawk)использование FPATдля определения поля как последовательности не-#@символов:

$ gawk '{$1=$1} 1' FPAT='[^#@]+' OFS='\n' file >> Sequence.txt
$ 
$ tail Sequence.txt 
HelloMyName
IsAdam
NiceToMeetYou

Аналогичный подход, на perl:

perl -lpe '$_ = join "\n", /[^#@]+/g' file >> Sequence.txt
0
28.04.2021, 23:28

Эта последовательность:

[^#]*    # Accept some string of characters that are **not** the start character.
#        # Followed by an start character #
[^@]*    # Followed by an string of **not** ending characters.
@        # Followed by an ending character.

Повторение несколько раз захватило бы (почти )всю линию.

Вот так:

s/[^#]*#\([^@]\)@/\1\n/g

Это преобразует строку ввода в несколько строк в соответствии с запросом.
Единственное, чего не хватает, это стереть то, что может остаться.

sed 's/[^#]*#\([^@]*\)@/\1\n/g;s/\(.*\)\n.*$/\1/'
0
28.04.2021, 23:28

Теги

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