仅使用 sed 和 grep:
grep "$2" "bookprint.txt" | sed 's/^/Author(s)! /; s/:/\nTitle! /; s/:/\nPublisher! /; s/:/\nYear! /; s/!/:/g'
在您的示例上对其进行测试以显示 sed 命令的示例输出:
$ echo "J.K. Rowling:Harry Potter:I dont know:2000's" | sed 's/^/Author(s)! /; s/:/\nTitle! /; s/:/\nPublisher! /; s/:/\nYear! /; s/!/:/g'
Author(s): J.K. Rowling
Title: Harry Potter
Publisher: I dont know
Year: 2000's
工作原理: sed 进行了五次替换。一般来说,每个替换工作看起来像`s/old/new/'。这指示 sed 查找“旧”的第一次出现并将其替换为“新”。因此,例如:
$ echo "this is so old" | sed 's/old/new/'
this is so new
我们使用的第一个替代品是:
s/^/Author(s)! /
对于 sed,插入符号 (^) 是一个特殊字符,它与行首匹配。因此,这种替换会导致“Author(s)!”被放置在行首。
第二个替代命令是
s/:/\nTitle! /
这会导致第一次出现的冒号 (":") 被替换为 "\nTitle!",其中 \n 被视为换行符。
如果我们刚刚使用了这两个命令,结果将是:
$ echo "J.K. Rowling:Harry Potter:I dont know:2000's" | sed 's/^/Author(s)! /; s/:/\nTitle! /'
Author(s)! J.K. Rowling
Title! Harry Potter:I dont know:2000's
所以,我们仍然需要输入出版商和年份。
查看上面的输出,您会看到,在完成上面的两次替换后,第一个冒号出现在出版商名称之前。所以,第三个替代命令是:
s/:/\nPublisher! /
此命令将第一次出现的冒号 (":") 替换为 "\nPublisher!"。年份行的创建方式与替换相同:
s/:/\nYear! /
只有这四个替换,我们将:
$ echo "J.K. Rowling:Harry Potter:I dont know:2000's" | sed 's/^/Author(s)! /; s/:/\nTitle! /; s/:/\nPublisher! /; s/:/\nYear! /'
Author(s)! J.K. Rowling
Title! Harry Potter
Publisher! I dont know
Year! 2000's
这看起来不错,只是我们在需要冒号的地方有感叹号。所以,我们需要的最后一个替换是:
s/!/:/g
注意末尾的“g”。这告诉 sed 在全球范围内进行这种替换。因此,这个替换告诉 sed 用冒号替换 every 感叹号。这给出了您想要的结果。