Как преобразовать многострочный текст в одну строку? - PullRequest
12 голосов
/ 19 мая 2011

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

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

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

lkdjasdjskdjaskdjasdkjskdhfjlkdfjlkdsfjsdlfkkldshfjlsdhjfksdhfksdjjdhsfkjsdhfksdjfhskdfhjhdfkjsdhfkjsdhfkjsdhf

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

Ответы [ 11 ]

13 голосов
/ 19 мая 2011
5 голосов
/ 19 мая 2011

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

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

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

4 голосов
/ 26 февраля 2017

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

tr '\n' ' ' < key.txt

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

2 голосов
/ 19 мая 2011
grep '^[^<]' test.txt | tr -d '\n'
1 голос
/ 19 мая 2011
awk '/ key (start|stop) / {next} {printf("%s", $0)} END {print ""}' filename
1 голос
/ 19 мая 2011

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

0 голосов
/ 08 июля 2019
tail -n +2 key.txt | head -n -1 | tr -d '\n'

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

0 голосов
/ 27 февраля 2017

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

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

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

0 голосов
/ 19 мая 2011

Вы также можете использовать 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
0 голосов
/ 19 мая 2011
grep  -v -e "key start" -e "key stop" /PATH_TO/key | tr -d '\n'
...