Перенаправление на STDIN в Bash - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий (упрощенный) скрипт

#!/bin/bash

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

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

Я хочу, чтобы вторая замена работала на выходе первой замены, не считывая их в переменную сценария, чтобы я мог легко их связать.

Он отлично работает на первом проходе, я предполагаю, что мне нужно снова передать или перенаправить вывод команды replace (sed) в stdin, чтобы вторая замена могла использовать его в своем собственном sed.

Редактировать:

В скрипте будет неопределенное количество вызовов для замены и аналогичных функций.Соединение первых двух вместе не решает мою проблему, поскольку она не масштабируется или скорее работает только для фиксированного числа вызовов.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете использовать это и можете передать 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

Таким образом, вы могли видеть, что test1 заменяется на SINGH и test2 на KING аналогично, мы могли бы сделать это больше.

0 голосов
/ 30 мая 2018

Вы можете передать их по трубам:

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

или:

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