【发布时间】:2014-08-15 05:28:37
【问题描述】:
我 posted previously 关于我正在编写的一个小脚本。我最终想通了这个问题。现在我遇到了另一个问题。希望您能提供帮助。
一些设置:我有一个存储为降价文件的短列表。
|One Hundred Years of Solitude|Gabriel García Márquez|-|-|-|-|1967|
|Moby-Dick|Herman Melville|-|-|-|-|1851|
|Frankenstein|Mary Shelley|-|-|-|-|1818|
|On the Road|Jack Kerouac|-|-|-|-|1957|
|The Turn of the Screw|Henry James|-|-|-|-|-|
我已经弄清楚了如何通过 cat、sed、xargs 和 awk 输入文件。
cat list.md | sed -e 's/^\|//' -e 's/\|$//' -e 's/^ *//' \
-e '/^\:/d' -e '/\'Title'/d' -e '/^\r/d' -e '/^$/d' | xargs -0 echo | \
awk -F '|' '{print "----"} {print "Title:", $1} {print "Author:", $2} \
{print "Date Begun:", $4} {print "Date Finished:", $5}'
该命令返回:
----
Title: One Hundred Years of Solitude
Author: Gabriel García Márquez
Date Begun: -
Date Finished: -
----
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -
----
Title: Frankenstein
Author: Mary Shelley
Date Begun: -
Date Finished: -
----
Title: On the Road
Author: Jack Kerouac
Date Begun: -
Date Finished: -
----
Title: The Turn of the Screw
Author: Henry James
Date Begun: -
Date Finished: -
我想做的是将它合并到一个脚本中,我可以使用诸如“books Melville”之类的参数运行该脚本,该参数将运行上述命令,将其通过管道输入 grep,搜索参数(最好是单词或一个字符串),然后返回整行。比如,如果我输入“books Melville”,脚本会返回
----
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -
目前,如果我输入“books Melville”,它返回的只是“作者:Herman Melville”。
抱歉,帖子太长了。
再次道歉编辑:我忘了提到我在 OSX 上。
【问题讨论】:
-
对于初学者来说,这个长命令似乎非常过于复杂,但话虽如此,为什么不过滤 before 那个转换呢?在我看来,这似乎更简单,只需要 grep。
-
另外,
-e '/\'Title'/d'并没有按照您的意思行事。它不会逃避第二个',因为你不能在shell 中这样做。这分解为三个字符串:单引号/\,未引用Title单引号/d。 -
@EtanReisner 我完全承认该命令可能要简单得多,但我想开始自学正则表达式。至于
-e '/\'Title'/d',我只是省略了降价表的前两行,其中包含与该正则表达式对应的字符串。 -
我并不是说它没有达到您的预期。我建议将字符串放在命令行上的方式可能不是您认为的那样。它不是单引号字符串中的转义单引号,因为单引号字符串不支持这样的转义。 (由于这样你会有三个未转义的单引号,所以计数也会被取消。