Как преобразовать многострочный текст в одну строку?

Я пытаюсь сделать txt файл с сгенерированным ключом в 1 строку. Пример:

<----- key start ----->
lkdjasdjskdjaskdjasdkj
skdhfjlkdfjlkdsfjsdlfk
kldshfjlsdhjfksdhfksdj
jdhsfkjsdhfksdjfhskdfh
jhdfkjsdhfkjsdhfkjsdhf
<----- key stop ----->

Я хочу, чтобы он выглядел так:

lkdjasdjskdjaskdjasdkjskdhfjlkdfjlkdsfjsdlfkkldshfjlsdhjfksdhfksdjjdhsfkjsdhfksdjfhskdfhjhdfkjsdhfkjsdhfkjsdhf

Обратите внимание: я также хочу удалить строки <----- key start -----> и <----- key stop ----->. Как я могу это сделать? Будет ли это сделано с помощью sed?

Ответ 2

Если вы ищете все, что вы просили в одном sed, у меня есть это...

sed -n '1h;2,$H;${g;s/\n//g;s/<----- key \(start\|stop\) ----->//g;p}' key.txt

Но это не совсем легко читается:) Если вы не против прокладывать пару команд, вы можете использовать предложения grep, tr, sed и т.д. в остальных ответах, которые вы получили.

Ответ 3

Чтобы преобразовать многострочный вывод в отдельную разделительную линию, используйте

tr '\n' ' ' < key.txt

Я знаю, что это не отвечает на подробный вопрос. Но это один из возможных ответов на титул. Мне нужен этот ответ, и мой поиск в Google нашел этот вопрос.

Ответ 4

grep '^[^<]' test.txt | tr -d '\n'

Ответ 5

Простым способом было бы использовать cat file.txt | tr -d '\n'

Ответ 6

awk '/ key (start|stop) / {next} {printf("%s", $0)} END {print ""}' filename

Ответ 7

В vim это просто:% s/^ M//

Я использую это все время для создания разделенных запятыми списков из строк. Для sed или awk ознакомьтесь со многими решениями по этой ссылке:

http://www.unix.com/shell-programming-scripting/35107-remove-line-break.html

Пример:

paste -s -d ',' tmpfile | sed 's/,/,/g'

Ответ 8

grep  -v -e "key start" -e "key stop" /PATH_TO/key | tr -d '\n'

Ответ 9

Вы можете использовать man 1 ed для соединения строк:

str='
aaaaa
<----- key start ----->
lkdjasdjskdjaskdjasdkj
skdhfjlkdfjlkdsfjsdlfk
kldshfjlsdhjfksdhfksdj
jdhsfkjsdhfksdjfhskdfh
jhdfkjsdhfkjsdhfkjsdhf
<----- key stop ----->
bbbbb
'


# for in-place file editing use "ed -s file" and replace ",p" with "w"
# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str")
   H
   /<----- key start ----->/+1,/<----- key stop ----->/-1j
   /<----- key start ----->/d
   /<----- key stop ----->/d
   ,p
   q
EOF


# print the joined lines to stdout only
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str")
   H
   /<----- key start ----->/+1,/<----- key stop ----->/-1jp
   q
EOF

Ответ 10

Это может сработать для вас (GNU sed):

sed -r '/key start/{:a;N;/key stop/!ba;s/^[^\n]*\n(.*)\n.*/\1/;s/\n//g}' file

Соберите линии между key start и key stop. Затем удалите первую и последнюю строки и удалите все новые строки.

Ответ 11

tail -n +2 key.txt | head -n -1 | tr -d '\n'

Хвост, чтобы удалить первую строку, голова, чтобы удалить последнюю строку, и tr, чтобы удалить новые строки.