OS X终端:在输出中添加逗号

时间:2016-07-02 06:19:00

标签: macos sed terminal xargs

我试图找出如何在应用程序名称和应用程序版本的两个行输出之间添加逗号。

这是我目前的代码和输出:

ordepmod-mbp:~ ordepmod$ mdls -name kMDItemFSName /Applications/*VMware*.app -name kMDItemVersion | sed 's/[^"]*"\([^"]*\)".*/\1/' | xargs -L 2
VMware Fusion.app 8.1.1
VMware Horizon Client.app 4.0.1

我无法弄清楚使用哪种语法可以使现有命令尽可能简单,同时将“.app”替换为“.app”。所以预期的输出看起来像(手动编辑):

VMware Fusion.app, 8.1.1
VMware Horizon Client.app, 4.0.1

1 个答案:

答案 0 :(得分:1)

我没有VMware进行测试,因此我将改为使用iTunes

最简单的方法

基本上,我指定mdls的原始输出来摆脱所有无关的东西,然后使用tr将两个字段之间的NUL音译成逗号。这很简单,但之后没有给你空间,但可能还不错。

mdls -name kMDItemFSName -name kMDItemVersion -raw /Applications/iTunes.app | tr '\0' ','
iTunes.app,12.4.1

稍微更难,更准确

tr替换NUL是可以的,但是你不能同时获得逗号和空格,因为tr只能执行“一对一”替换。 sed可以用逗号和空格替换单个NUL,但是对于OSX上的非GNU版sed来说并不是很容易,所以我会选择perl

mdls -name kMDItemFSName -name kMDItemVersion -raw /Applications/Textedit.app | perl -pe 's/\x0/, /'
TextEdit.app, 1.11

通配符版本

或者,如果你想使用通配符,我会选择awk

mdls -name kMDItemFSName -name kMDItemVersion /Applications/*.app | awk -F'"' '/kMDItemFSName/{n=$2} /kMDItemVersion/{print n, $2}' OFS=', '

<强>输出

App Store.app, 2.1
Automator.app, 2.6
Calculator.app, 10.8
Calendar.app, 8.0
Carbon Copy Cloner.app, 4.1.9
Chess.app, 3.13
Contacts.app, 9.0
...
Sonos.app, 6.2.2
Stickies.app, 10.0
System Preferences.app, 14.0
TextEdit.app, 1.11
TextWrangler.app, 5.0.2
Time Machine.app, 1.3
VirtualBox.app, 5.0.24
Xcode.app, 7.3
iBooks.app, 1.5
iMovie.app, 10.1.2
iTunes.app, 12.4.1

awk命令基本上将输入字段分隔符设置为",然后每次看到kMDItemFSName时,它将第二个字段(应用名称)保存为{{ 1}}。然后,每次看到n时,它都会输出保存的名称和第二个字段(即版本)。 OFS(输出字段分隔符)设置为逗号和空格。