簡體   English   中英

awk / sed加入所有行並將其傳遞給另一個程序

[英]awk/sed join all lines and pass it to another program

我有一個腳本,可從目錄中為我隨機抽取N個文件,我需要將輸出作為amarok或vlc的參數傳遞。

我的腳本pick.sh是:

#!/usr/bin/env bash
find "$1" -name *mp3 | shuf -n "$2" | sed -r 's/(.*)/"&"/' | awk 'NR%10{printf $0" ";next;}1'#it should be $2 instead of 10

因此,要在我的音樂目錄中隨機選擇3個文件,我要做:

pick.sh /music/ 3

腳本返回3首歌曲,每首歌曲都用雙引號括起來(因為它們可能包含空格),它們全部一行:

“ / music / s / Los Straitjackets /!Viva!/ Los Straitjackets-Outta Gear.mp3”“ / music / p / Plastilina Mosh / Juan Manuel / Plastilina Mosh-Graceland.mp3”“ / music / s / Snoop Dogg / R&G (節奏與黑幫);傑作/史努比·道格-No Thang On Me.mp3“

但我想直接將pick.sh的結果傳遞給vlc:

vlc "$(pick.sh /music/ 3)" &

但會添加每個令牌,並用空格分隔。

但是,如果我復制pick.sh的輸出,然后在調用vlc之后將其粘貼,則一切正常。

我怎樣才能使VLC(或amarok或任何程序)正確解析pick.sh的輸出?

謝謝您的幫助!

最好不要手動引用文件名,因為名稱也可以包含引號,因此您應該正確地對它們進行轉義。

可以一個一個地寫文件名,每個文件名放在自己的行上,然后使用xargs程序為vlc提供參數:

 find "$1" -name '*.mp3' -print | shuf -n "$2" | xargs vlc

誠然,如果您的音樂收藏中包含名稱中帶有'\\ n'(換行符)的文件(很好,雖然不太可能,但它可能是 :)),那么您必須應對這種情況,並使用'\\ 0'作為記錄分隔符在每個處理階段:

find "$1" -name '*.mp3' -print0 | shuf -z -n "$2" | xargs -0 vlc

但是通常這太過分了。

還應該提到的是,在類似unix的shell中,與Microsoft Windows方法不同,程序不解析其命令行參數,因為命令行參數以單獨的形式傳遞給程序。 所有由空格進行的拆分,處理引用等均由調用方(通常是外殼程序)執行。 這解釋了為什么當您簡單地將給定的行復制到shell並“手動”運行時,vlc才能正確運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM