Bash - как сохранить новую строку в выводе команды sed?

Предположим, у меня есть файл BookDB.txt, в котором хранятся данные в следующем формате:

Harry Potter - The Half Blood Prince:J.K Rowling:40.30:10:50
The little Red Riding Hood:Dan Lin:40.80:20:10
Harry Potter - The Phoniex:J.K Rowling:50.00:30:20
Harry Potter - The Deathly Hollow:Dan Lin:55.00:33:790
Little Prince:The Prince:15.00:188:9
Lord of The Ring:Johnny Dept:56.80:100:38
Three Little Pig:Andrew Lim:89.10:290:189
All About Linux:Ubuntu Team:76.00:44:144
Catch Me If You Can:Mary Ann:23.60:6:2
Python for dummies:Jared Loo:15.99:1:10

Я пытаюсь заменить разделитель (:) на (,) в моем выводе. Это успешно, но удаляет новую строку из вывода. Вот мой код:

TITLE=Potter
OUTPUT=$(cat BookDB.txt | grep $TITLE)
OUTPUT1=$(sed 's/:/, /g' <<< $OUTPUT)
echo $OUTPUT1

Я хочу, чтобы мой результат выглядел так:

Harry Potter - The Half Blood Prince, J.K Rowling, 40.30, 10, 50
Harry Potter - The Phoniex, J.K Rowling. 50.00. 30. 20
Harry Potter - The Deathly Hollow, Dan Lin, 55.00, 33, 790

Однако выглядит это так:

 Harry Potter - The Half Blood Prince, J.K Rowling, 40.30, 10, 50 Harry Potter - The Phoniex, J.K Rowling, 50.00, 30, 20 Harry Potter - The Deathly Holl
ow, Dan Lin, 55.00, 33, 790

Если бы кто-нибудь мог поделится, как сохранить разрыв строки в выводе, я был бы очень признателен!


person Jared Aaron Loo    schedule 04.08.2014    source источник


Ответы (3)


Просто используйте правильную цитату:

TITLE=Potter
OUTPUT=$(cat BookDB.txt | grep $TITLE)
OUTPUT1=$(sed 's/:/, /g' <<< "$OUTPUT")
echo "$OUTPUT1"

Поскольку \n является частью значения по умолчанию IFS, он удаляется без двойных кавычек.

Подробнее о цитировании здесь

person Aserre    schedule 04.08.2014
comment
+1, но, конечно, вы можете существенно реорганизовать его, чтобы просто sed -n "/$TITLE/s/:/, /gp" BookDB.txt - person tripleee; 04.08.2014
comment
@tripleee Действительно. Как уже указывал Анубхава, я просто выделил проблему цитирования (которая может вызвать больше проблем позже в коде OP) - person Aserre; 04.08.2014

Вы можете избежать cat и сделать все в sed:

sed -n '/Potter/s/:/, /gp' file
Harry Potter - The Half Blood Prince, J.K Rowling, 40.30, 10, 50
Harry Potter - The Phoniex, J.K Rowling, 50.00, 30, 20
Harry Potter - The Deathly Hollow, Dan Lin, 55.00, 33, 790
person anubhava    schedule 04.08.2014

Используя awk. Соответствие будет зависеть от заголовков и не будет включать имя автора.

awk -F: -v OFS=', ' '$1 ~ /Potter/ { $1 = $1; print }' file

Вывод:

Harry Potter - The Half Blood Prince, J.K Rowling, 40.30, 10, 50
Harry Potter - The Phoniex, J.K Rowling, 50.00, 30, 20
Harry Potter - The Deathly Hollow, Dan Lin, 55.00, 33, 790

Это не дает результата:

awk -F: -v OFS=', ' '$1 ~ /Rowling/ { $1 = $1; print }' file

Но это будет:

awk -F: -v OFS=', ' '$2 ~ /Rowling/ { $1 = $1; print }' file

Вывод:

Harry Potter - The Half Blood Prince, J.K Rowling, 40.30, 10, 50
Harry Potter - The Phoniex, J.K Rowling, 50.00, 30, 20

Для сопоставления с заголовком и автором вы можете иметь:

awk -F: -v OFS=', ' '$1 ~ /Potter/ && $2 ~ /Rowling/ { $1 = $1; print }' file

Или для соответствия, если какой-либо из них:

awk -F: -v OFS=', ' '$1 ~ /Potter/, $2 ~ /Rowling/ { $1 = $1; print }' file
person konsolebox    schedule 04.08.2014