2015-01-22 2 views
0

У меня есть файл, содержащий:как положить | между линиями содержимого текстового файла?

L1 
L2 
L3 
. 
. 
. 
L512 

Я хочу изменить его содержание:

L1 | L2 | L3 | ... | L512 

Это кажется так просто, но в настоящее время 1 час Im сидит и пытается сделать это, я попытался сделать это sed, но не получил то, что я хочу. Кажется, что sed просто вставляет пустые строки между контентом, любые предложения, пожалуйста?

+0

возможно дубликат [SED: Как я могу заменить новой строки (\ п)] (Http: // StackOverflow .com/questions/1251999/sed-how-can-i-replace-a-newline-n) – Kalanidhi

+0

Я пробовал, как было предложено в этом посте, sed ': a; N; $! ba; s/\ n/|/g 'labellist, но, похоже, это не сработало, я также попытался установить \ before | , но нет работы – KianStar

+0

и с использованием опции -i: sed -i ': a; N; $! ba; s/\ n/|/g' labellist, я получаю эту ошибку: sed: 1: "labellist": extra символов в конце команды l – KianStar

ответ

1

С СЭД это требует, чтобы прочитать весь вход в буфер, а затем заменить все символы новой строки по |, как это:

sed ':a;N;$!ba;s/\n/ | /g' input.txt 

Часть 1 - b uffering входа

:a определяет метку под названием «а» N получает следующую строку из входных данных и добавляет его в шаблоне буфер $!ba перескакивает на a, если конец ввода не будет достигнут

Часть 2 - замена новых строк от |

s/\n/|/ выполнить команду замены по образцу buffern


Как вы можете видеть, это очень неэффективно, так как требует, чтобы:

  • прочитать полный ввод в память
  • работает три раза на входе: 1. чтение, 2. Подставив, 3. печати

Поэтому я бы предложил использовать AWK, которые могут сделать это в одном цикле:

awk 'NR==1{printf $0;next}{printf " | "$0}END{print ""}' input.txt 
+1

Чтобы получить новую строку в конце, поставьте 'END {print" "}' на 'awk' – Jotne

+0

@ Jotne О да, я вижу :) thx – hek2mgl

+0

Спасибо, это работает! – KianStar

1

Вот один sed

sed ':a;N;s/\n/ | /g;ta' file 
L1 | L2 | L3 | ... | L512 

И один awk

awk '{printf("%s%s",sep,$0);sep=" | "} END {print ""}' file 
L1 | L2 | L3 | ... | L512 
-1

Несколько вариантов, в том числе MENT ioned здесь:

paste -sd'|' file 
sed ':a;N;s/\n/ | /g;ta' file 
sed ':a;N;$!ba;s/\n/ | /g' file 
perl -0pe 's/\n/ | /g;s/ \| $/\n/' file 
perl -0nE 'say join " | ", split /\n/' file 
perl -E 'chomp(@x=<>); say join " | ", @x' file 
mapfile -t ary < file; (IFS="|"; echo "${ary[*]}") 
awk '{printf("%s%s",sep,$0);sep=" | "} END {print ""}' file 
+0

'прошлое' не работает с' | '. Это просто сборник других сообщений здесь :((кроме perl и map) – Jotne

0
perl -pe 's/\n/ |/g unless(eof)' file 
+0

Вы должны добавить пробел после '' ', чтобы получить его правильно :) – Jotne

0

если пространство между | не является обязательным

tr "\n" '|' YourFile 
+1

Это то же самое, что и Wintermute, и дает дополнительную' '' at конец строки, и не дает пробел вокруг '|' – Jotne

+1

Извините, не видел ответа Wintermute (и все еще нет). Хорошая точка для последнего '|', поэтому для этого требуется, по крайней мере, последовательность труб с седлом или аналогичным. – NeronLeVelu

+0

Wintermute удалил свой андер, поскольку он не дал правильного результата. Если у вас более 10000 баллов, вы можете увидеть удаленный ответ. – Jotne

Смежные вопросы