管道拆分输入到命令

时间:2012-10-23 22:40:09

标签: linux bash unix pipe

我正试图弄清楚管道问题。我的目标是这样的

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" />

这是一个简单的例子,我知道,但我认为这说明了我的问题。

  • 编辑1

好吧,我的管道走错了路,但我仍然无法理解这一点。

这是一个更简单的例子

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

这种命令可能吗?

  • 编辑2

如此接近!

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

这会起作用,除了由于某种原因cut不能读取STDIN :(它们在正常运行时返回正确的值但我需要它们作为替换命令的参数

2 个答案:

答案 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数组{{1} }。可以像这样访问数组元素:( ... )

${varname[index]}在文件sed -i中执行就地替换。如果您不想这样,请删除index.html并将输出重定向到新文件:

-i

答案 1 :(得分:0)

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