2016-02-29 46 views
2

我想創建一個簡單的正則表達式來匹配一些文件。該命令npm ls --dev --parseable打印出一堆文件,例如:如何拆分,映射和加入Bash?

/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

爲了得到這個,我想「按換行符分割,映射到基本名稱,並用管道連接「。在JavaScript與Ramdajs,我想這樣是這樣的:

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

任何想法如何做這樣的事情在bash?做這件事的慣用方法是什麼?

+0

一般 - 如果你想要一個班輪,而不是回答的重點是精確性和簡潔性,你應該在Code Golf而不是StackOverflow。 –

+0

... short form:可以在bash中使用傳統的函數式編程原語,但需要自己構建它們;我們正在談論100行左右的庫代碼。 –

+0

我明白了。我只是對在bash中完成此操作的正確方法感興趣。這些只是我習慣的那種看起來很直觀的語義。 – Chet

回答

4

Bash沒有內置函數式編程原語。可以用100行代碼構建它們,但對於這種用例也不是特別值得。


考慮:

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

...這個路線NPM的標準輸出爲sed,告訴它在每一行與一個空字符串取代一切到最後一個斜線,然後路由將sed的標準輸出轉換爲paste,使用它將所有行合併爲一個單獨的字符串,並用|將它們分開。


或者,使用無不是內置的bash本身的工具(比你的數據源等,npm):

#!/bin/bash 
# note that this requires bash 4.0 or later 
mapfile -t lines < <(npm ls --dev --parseable) # read content into array 
lines=("${lines[@]##*/}")     # trim everything prior to last/in each 
(IFS='|'; printf '%s\n' "${lines[*]}")   # emit array as a single string with |s 
1

你可以只管那個東西awk並有awk挑了最後元素:

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

awk腳本將被拆分傳入記錄,抓住最後一個元素$(NF)變量output與管道分隔,然後,一旦完成,將使用gsub剝離最後一個管道和吐結果出來