我想创建一个简单的正则表达式来匹配某些文件。命令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中做这样的事情?什么是习惯性的做法?
答案 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
并吐出结果