簡體   English   中英

在bash腳本中的變量上運行sed

[英]Running sed ON a variable in bash script

對於一個看似無知的問題表示歉意。 但是我花了一整天的時間試圖弄清楚它,它使我無法自拔。 我正在嘗試編寫一個看似簡單的bash腳本,該腳本將從ls中獲取目錄中的文件列表,使用sed替換部分文件名,從列表中獲取唯一名稱,然后將其傳遞給某些命令。 像這樣:

inputs=`ls *.ext`
echo $inputs
test1_R1.ext  test1_R2.ext  test2_R1.ext  test2_R2.ext

現在,我想通過sed將其替換為*,以將1.ext和2.ext替換為test1_R *等。然后,我想通過運行sort -u到達以下$ outputs變量來刪除結果重復項:

echo $outputs
test1_R* test2_R*

並將其傳遞給命令,像這樣

cat $outputs

我可以在命令行中執行以下操作:

ls *.ext | sed s/..ext/\*/g | sort -u

但是,如果我嘗試將上述內容分配給腳本中的變量,它只會返回ls的輸出。 我嘗試了幾種方法來做到這一點:在腳本中包括整個管道。 分別運行每個命令並將其分配給變量,然后將該變量傳遞給下一個命令,並將輸出寫入文件,然后將文件傳遞給下一個命令。 但是到目前為止,這些都沒有實現我的目標。 我認為我的問題出在(除了一般的無知bash腳本之外)無法在腳本中的變量上運行seq。 關於如何在sed中將變量傳遞給模式或替換字符串,似乎有很多建議,但是它們似乎都以文件作為輸入。 但是我知道這可能不是正確的方法。 因此,如果有人能提出一種優雅的實現方式,我將非常感激。

非常感謝!

更新2/06/2014

嗨,巴爾瑪,謝謝您的回答。 不能說它解決了問題,但它有助於查明問題。 似乎問題出在我使用星號。 我不得不說,我很困惑。 我得到的實際文件名是:

test1_R1.fastq.gz test1_R2.fastq.gz test2_R1.fastq.gz test2_R2.fastq.gz

如果我使用的是您建議的代碼,對我來說似乎是正確的方法:

ins=$(ls *.fastq.gz | sed 's/..fastq.gz/\\*/g' | sort -u)

Sed似乎什么也沒做,我得到的是ls的輸出:

test1_R1.fastq.gz test1_R2.fastq.gz test2_R1.fastq.gz test2_R2.fastq.gz

現在,如果我將反斜杠替換為其他任何東西,則sed可以正常工作,但它還會返回我在星號前面(或后面)加上的任何字符:

ins=$(ls *.fastq.gz | sed 's/..fastq.gz/"*/g' | sort -u)
test1_R"* test2_R"*

這很奇怪,但是可以肯定的是,我可以在星號前面放一個“ R”,然后在搜索模式字符串中替換R,對嗎? 錯誤! 如果我以任何方式進行操作: 's/R..fastq.gz/R*/g' 's/...fastq.gz/R*/g' 's/[AZ]..fastq.gz/R*/g'我又回到了原來的名字! 即使我最終得到類似test1_RR* test2_RR*並嘗試再次通過sed運行它,並用"_R"代替"_""RR"代替"R" ,我還是沒有運氣,我回來了保留原始名稱。 但是我可以替換其余的文件名沒有問題,只是不要讓我需要我的test1_R*

我覺得我應該以某種非常聰明的方式來逃避*,但是我嘗試過的任何事情似乎都沒有用。 再次感謝你的幫助!

這是您如何在變量中捕獲整個管道的結果的方式:

var=$(ls *.ext | sed s/..ext/\*/g | sort -u)

暫無
暫無

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

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