简体   繁体   English

Bash - 如何在sed命令输出中保留换行符?

[英]Bash - how to preserve newline in sed command output?

Assuming I have a file BookDB.txt which stores data in the following format : 假设我有一个文件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

I am trying to replace the (:) delimiter with (, ) in my output. 我想在输出中用(,)替换(:)分隔符。 It succeeds, but removes the newline from the output. 它成功,但从输出中删除换行符。 Here is my code : 这是我的代码:

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

I want my output to look like this : 我希望我的输出看起来像这样:

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

However, it looks like this : 但是,它看起来像这样:

 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

If anyone could share how to preserve the line break in the output, I would be very grateful! 如果有人可以分享如何在输出中保留换行符,我将非常感激!

Just use correct quotation : 只需使用正确的报价:

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

As \\n is part of the default value of IFS , it is removed without the double quotes. 由于\\nIFS默认值的一部分,因此不使用双引号将其删除。

More info on quoting here 在引用更多信息点击这里

You can avoid cat and do all in sed: 你可以避免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

Using awk . 使用awk Matching would be specific to the titles and doesn't include the author's name. 匹配将特定于标题,不包括作者的姓名。

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

Output: 输出:

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

This gives no output: 这没有输出:

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

But this will: 但这会:

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

Output: 输出:

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

To match against both title and author you can have: 要匹配标题和作者,您可以:

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

Or to match if any validates: 或者如果有任何验证匹配:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM