2012-10-23 140 views
0

我想弄清楚管道問題。我的目標是這樣的管道分割輸入到命令

replace $1 $2 index.html | split -d ':' | minify main.css 

從哪兒main.css的輸出

main.css:main.min.css 

和index.html會從這樣的:

<link href="main.css" /> 

這樣:

<link href="main.min.css" /> 

這是一個簡單的例子,我知道w,但我認爲這說明了我的問題。

  • 編輯1

好了,我得到了管道走錯了路身邊,但我仍然不知道這一點。

這裏有一個簡單的例子

echo 'foo:bar' | split -d ':' | replace $1 $2 -- index.html 

是那種命令的可能嗎?

  • 編輯2

如此接近!

minify css/main.css | replace $(cut -f1 -) $(cut -f2 -) index.html 

這將只是由於某種原因,切不能讀取STDIN :(他們返回正確的值時,工作正常運行,但我需要他們的論據,替換命令

+0

我覺得你有管道周圍的錯誤的方式。它從左到右流動,非常像英語。 – jurgemaister

+0

很酷,我更新了帖子 –

回答

1

我不想你可以用一個班輪做到這一點,因爲你試圖從兩個不同的來源(管道以及輸入文件)中讀取輸入像這樣的東西可能會奏效,但:

IFS_SAVE=$IFS 
IFS=: a=(`echo "foo:bar"`) 
sed -i "s/${a[0]}/${a[1]}/g" index.html 
IFS=$IFS_SAVE 

IFS=:指令更改了field separator代表從換行到:的下列命令,以便嵌套的echo將兩個字段放入bash數組(...)。陣列元素可以像這樣訪問:${varname[index]}

sed -i在文件index.html中進行就地替換。如果你不希望出現這種情況,刪除-i和輸出重定向到一個新的文件:

sed "s/${a[0]}/${a[1]}/g" index.html > output.html 
+1

你可以縮短使用IFS:'''IFS =:a =('echo「foo:bar」')''' (https://en.wikipedia.org/ wiki/Internal_field_separator) – Marian

+0

@Marian好點。固定。 –

+0

儘管至少在我的系統中,'IFS'仍然是':'。 – doubleDown

0
IFS=: read -ra a <<<'foo:bar' 
ed -s index.html <<EOF 
g/${a}/s,,${a[1]} 
w 
EOF