在Bash中重定向到STDIN

时间:2018-05-30 12:37:24

标签: bash sed io-redirection

我有以下(简化)脚本

#!/bin/bash

replace(){
    sed "s/$1/$2/g"
}

#first
replace "search" "replacement"
#second
replace "replacement" "again"

我希望第二个替换能够处理第一个替换的输出而不将它们读入脚本变量,这样我就可以轻松地将它们进一步链接。

它在第一次传递时完美地工作,我假设我需要将replace(sed)的输出管道或重定向到stdin再次使得第二次替换将能够在它自己的sed中使用它。

编辑:

在脚本中将有无限次的替换和类似函数调用。将前两个连接在一起并不能解决我的问题,因为它无法扩展或仅适用于固定数量的呼叫。

2 个答案:

答案 0 :(得分:2)

你可以管它们:

replace "search" "replacement" | replace "replacement" "again"

或:

replace "$(replace "search" "replacement")" "again"

答案 1 :(得分:0)

你可以使用它并且可以将N个参数传递给你的脚本,不需要多次调用多个函数。

cat script.ksh
var=$(echo $@)
awk -v line="$var" 'BEGIN{num=split(line, array," ")} {for(i=1;i<=num;i+=2){sub(array[i],array[(i+1)])}} 1'  Input_file

此处也添加非单行代码形式。

cat script.ksh
var=$(echo $@)
awk -v line="$var" '
BEGIN{ num=split(line, array," ") }
{
  for(i=1;i<=num;i+=2){
   sub(array[i],array[(i+1)])}
}
1'  Input_file

执行代码:

假设以下是Input_file

cat Input_file
t1 test2 test3
fwvwv wbvw4e314 211232
test1 test2 test3

现在执行上面的代码后,script.ksh跟随将是输出。

./script15.ksh test1 SINGH test2 KING
t1 KING test3
fwvwv wbvw4e314 211232
SINGH KING test3

所以你可以看到test1SINGHtest2替换为KING同样我们可以做更多。