如何在Bash中拆分,映射和加入?

时间:2016-02-29 19:17:08

标签: regex bash

我想创建一个简单的正则表达式来匹配某些文件。命令npm ls --dev --parseable打印出一堆文件,例如:

/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/tough-cookie
/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/tunnel-agent
/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/rimraf
/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/rimraf/node_modules/glob
/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/rimraf/node_modules/glob/node_modules/inflight
/Users/chetcorcos/code/dev-tool/node_modules/fsevents/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy

我想找回一个看起来像这样的字符串:

tough-cookie|tunnel-agent|rimraf|inflight|wrappy

为了得到这个,我想“按换行符分割,映射到基本名称,然后用管道连接”。在使用Ramdajs的JavaScript中,我会这样:

R.pipe(R.split('\n'), R.map(R.split('/')), R.map(R.nth(-1)), R.join('|'))

任何想法如何在bash中做这样的事情?什么是习惯性的做法?

2 个答案:

答案 0 :(得分:4)

Bash没有内置的函数式编程原语。可以使用一百行代码构建它们,但对于这种用例也不是特别值得。

考虑:

content=$(npm ls --dev --parseable | sed -e 's@.*/@@' | paste -s -d '|')
echo "$content"

...这会将NPM的stdout路由到sed,告诉它用空字符串替换每行中最后一个斜杠的所有内容,然后将sed的stdout路由到{ {1}},使用它将所有行合并为一个字符串,paste将它们分开。

或者,不要使用bash本身没有内置的工具(除了你的数据源|):

npm

答案 1 :(得分:1)

您可以将该内容传递给awk并让awk选择最后一个元素:

 npm ls --dev --parseable | awk -F"/" '{output=output$(NF)"|"} END { sub(/[|]+$/, "", output); print output }' 

awk脚本将按/拆分传入记录,使用管道划分最后一个元素$(NF)到变量output,然后一旦完成,将剥离最后一个管道使用gsub并吐出结果