Ответ 1
tr -d '\n' < key.txt
Я пытаюсь сделать txt файл с сгенерированным ключом в 1 строку. Пример:
<----- key start ----->
lkdjasdjskdjaskdjasdkj
skdhfjlkdfjlkdsfjsdlfk
kldshfjlsdhjfksdhfksdj
jdhsfkjsdhfksdjfhskdfh
jhdfkjsdhfkjsdhfkjsdhf
<----- key stop ----->
Я хочу, чтобы он выглядел так:
lkdjasdjskdjaskdjasdkjskdhfjlkdfjlkdsfjsdlfkkldshfjlsdhjfksdhfksdjjdhsfkjsdhfksdjfhskdfhjhdfkjsdhfkjsdhfkjsdhf
Обратите внимание: я также хочу удалить строки <----- key start ----->
и <----- key stop ----->
. Как я могу это сделать? Будет ли это сделано с помощью sed
?
tr -d '\n' < key.txt
Если вы ищете все, что вы просили в одном sed, у меня есть это...
sed -n '1h;2,$H;${g;s/\n//g;s/<----- key \(start\|stop\) ----->//g;p}' key.txt
Но это не совсем легко читается:) Если вы не против прокладывать пару команд, вы можете использовать предложения grep, tr, sed и т.д. в остальных ответах, которые вы получили.
Чтобы преобразовать многострочный вывод в отдельную разделительную линию, используйте
tr '\n' ' ' < key.txt
Я знаю, что это не отвечает на подробный вопрос. Но это один из возможных ответов на титул. Мне нужен этот ответ, и мой поиск в Google нашел этот вопрос.
grep '^[^<]' test.txt | tr -d '\n'
Простым способом было бы использовать cat file.txt | tr -d '\n'
awk '/ key (start|stop) / {next} {printf("%s", $0)} END {print ""}' filename
В vim это просто:% s/^ M//
Я использую это все время для создания разделенных запятыми списков из строк. Для sed или awk ознакомьтесь со многими решениями по этой ссылке:
http://www.unix.com/shell-programming-scripting/35107-remove-line-break.html
Пример:
paste -s -d ',' tmpfile | sed 's/,/,/g'
grep -v -e "key start" -e "key stop" /PATH_TO/key | tr -d '\n'
Вы можете использовать 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
Это может сработать для вас (GNU sed):
sed -r '/key start/{:a;N;/key stop/!ba;s/^[^\n]*\n(.*)\n.*/\1/;s/\n//g}' file
Соберите линии между key start
и key stop
. Затем удалите первую и последнюю строки и удалите все новые строки.
tail -n +2 key.txt | head -n -1 | tr -d '\n'
Хвост, чтобы удалить первую строку, голова, чтобы удалить последнюю строку, и tr, чтобы удалить новые строки.