2010-05-06 67 views
1

參數是有任何方式,以適應在1行中使用管道以下:輸出是另一個

輸出的

sha1sum $(xpi) | grep -Eow '^[^ ]+' 

去代替456

sed 's/@[email protected]/456/' input.txt > output.txt 
+0

您不能使用管道將輸出獲取到命令行參數中;給出的答案都有效,儘管我會用雙引號(另一個)Jonathan的。 – 2010-05-06 03:58:49

+0

@Jonathan Leffler:sed在這些雙引號中嵌套另一個命令不會很好地發揮作用。在shell試圖解析出要執行的命令之前,它會嘗試解析它。 – 2010-05-06 04:05:38

+0

@Trey:你是什麼意思? ''(...)'表示法中的命令將在'sed'開始前完全執行! – 2010-05-06 04:24:56

回答

1

這是不可能使用管道。命令嵌套工作,但:

sed 's/@[email protected]/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+')'/' input.txt > output.txt 

還要注意的是,如果嵌套的命令的結果包含/字符,你需要使用不同的字符作爲分隔符(#|$_是流行的)或以某種方式逃避你的字符串中的正斜線。 This StackOverflow question也有逃避問題的解決方案。通過將命令輸送到sed並替換所有正斜槓(用於轉義字符)和反斜槓(以避免與使用/作爲外部sed分隔符時發生衝突),可以解決問題。

下面的正則表達式將難逃所有\字符,並在命令所有/字符:

sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g' 

嵌套這正如我們前面所做的那樣,我們得到這個解決方案需要的地方應適當逃脫斜線:

sed 's/@[email protected]/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g')'/' input.txt > output.txt 

就我個人而言,我認爲這看起來像一條線,但它的工作原理。

+0

@Trey:是的,我知道那個,所以沒有辦法用'一行'來做,也許用管道呢? – Pablo 2010-05-06 03:32:30

+0

@邁克爾:對不起,我誤解了你的問題。我只是修改它在一行工作。我不相信管道是可能的,因爲你需要產生一個子命令,而不是直接將輸出重定向到另一個命令的輸入(這是管道的輸入) – 2010-05-06 03:33:58

+0

@Trey:感謝您的更新,但分號場景也不起作用... – Pablo 2010-05-06 03:49:17

2

嗯,我想你可以巢$(命令ARG ARG)occurances,所以如果你真的只需要一條線,儘量

sed "s/@[email protected]/$(sha1sum $(xpi) | grep -Eow '^[^ ]+')/" input.txt \ 
    > output.txt 

但我喜歡Trey的解決方案把它一個兩行;它不那麼令人困惑。

+0

@Trey:sed不會看到$; shell會執行'sha1sum $(xpi)| grep ...',然後試圖用'sha1sum |的輸出運行sed grep'嵌入命令行中。 – 2010-05-06 05:13:26

相關問題