我正在尝试找出管道问题。我的目标是这样的
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 外,这会起作用 :( 它们在正常运行时返回正确的值,但我需要它们作为替换命令的参数
最佳答案
我不认为你可以用单行代码来做到这一点,因为你正试图从两个不同的来源(管道和输入文件)读取输入。不过,这样的事情可能会奏效:
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
关于linux - 管道将输入拆分为命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040430/