Замените шаблон строки последовательностью с помощью sed.

No puede probar comandos completos dentro de los corchetes testdel shell. Desea eliminar esos corchetes por completo, lo que hará que simplemente pruebe el código de salida de los comandos.

#!/bin/bash

PREVIOUS_COMMIT=e099d95d52b8fca99e47fd7cee5f782287178b27
SERVICE=service-web-prj1

if ! git diff "$PREVIOUS_COMMIT" HEAD --name-only | grep -qs "$SERVICE" || ! git diff "$PREVIOUS_COMMIT" HEAD --name-only | grep -qs 'service-web'
then
        echo "Didn't pass first"
        exit 0
fi

echo passed first with "$SERVICE"

if ( ! echo "$SERVICE" | grep -q "^service-web" )
then
        echo "Didn't pass second"
        exit 0
fi

echo passed second with "$SERVICE"
1
16.07.2019, 00:21
2 ответа

л.с.; ДР:

Есть несколько способов обойти это, я думаю, что самый чистый для вашего примера случай:

for i in {1..5};do sed -i "s/abc/$(seq -s ' ' 1 $i)/g" test; done

То есть :мы просим seqиспользовать один единственный пробел для разделения каждого числа.

Пояснение:

Причина, по которой вы получили эти ошибки, заключается в том, что вывод из:

seq 1 5

не является:

1 2 3 4 5

а скорее:

1
2
3
4
5

А поскольку вы заключили$(seq 1 $i)Подстановку команд в двойные -кавычки, обычное Разбиение слов не выполняется, следовательно, все символы новой строки (, кроме последней )выходные данные утилиты seqостаются без изменений.

Поэтому фактическая sedкоманда стала:

sed -i "s/abc/1
2
3
4
5
/g" test

который не принят, потому что, что касается sed , вы предоставили его с командой s/abc/1, т. е. без требуемого финального /.

echo $(seq 1 5)печатает 1 2 3 4 5, потому что $(seq 1 5)не находится в двойных -кавычках, поэтому разделение слов происходит в соответствии с поведением оболочки по умолчанию.

Мы действительно можем исправить ваш пример, как и в:

for i in {1..5};do sed -i "s/abc/$(echo $(seq 1 $i))/g" test; done

, то есть путем замены команды (исходнойseq 1 $i)внутри другой замены команды (на echoна ).

Это работает даже в двойных -кавычках, потому что $(echo...)Подстановка команд выполняется в подоболочке , которая не в «Я -есть -] внутри -состояния -двойная -кавычка", поэтому разделение слов на выходе изseqбудет выполнено там .

0
28.01.2020, 00:06

Вы можете направить вывод во временный файл, а затем переместить временный файл поверх исходного. Кроме того, вы могли иметь в виду работать с одной строкой за раз, и в этом случае вам следует отказаться отg:

for i in {1..5}; do
    sed -e "s/abc/$(seq 1 $i)/" test > test.tmp
    mv test.tmp test
done
0
28.01.2020, 00:06

Теги

Похожие вопросы