Как Вы используете переменные сценария оболочки в качестве аргументов sed?

В Mac OS X (с использованием FreeBSD sed):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta
13
задан Swoogan 24 July 2009 в 17:23
поделиться

6 ответов

Для этого типа проблемы с цитированием вы можете выполнить одно из следующих действий:

#!/bin/sh
SED_ARG="-e 's/SOMETHING//g'"
echo SOMETHING | eval sed "$SED_ARG"
echo SOMETHING | sed $SED_ARG

Что происходит в вашей версии, оболочка вызывает sed с одним аргументом (строка "-e 's / SOMETHING // g '"), но вы хотите, чтобы sed вызывался с двумя аргументами (" -e "и"' s / SOMETHING // g '"). Eval заставляет оболочку интерпретировать строку так, как вы хотите, поскольку не цитирует аргумент, поэтому происходит разделение слов. Обратите внимание, что такие вещи довольно хрупкие.

18
ответ дан 1 December 2019 в 21:12
поделиться

Передача аргументов в сценарий sed демонстрируется на примере записи grep .

#!/bin/sh
#File: sedgrep
sed -n 's/'"$1"'/&/p'

grep может выполняться как,

sedgrep '[A-Z][A-Z]' <file
9
ответ дан 1 December 2019 в 21:12
поделиться

Удалите одинарные кавычки из значения EMAIL .

EMAIL="-e s/SOMETHING//g"
0
ответ дан 1 December 2019 в 21:12
поделиться

У меня это сработало (заключите в двойные кавычки):

 env | sed -n /"$USERNAME"/p
0
ответ дан 1 December 2019 в 21:12
поделиться

удалите одинарные кавычки, и все должно работать нормально

0
ответ дан 1 December 2019 в 21:12
поделиться

Поместите все в одинарные кавычки и позвольте оболочке вычислить это позже, когда оно будет использовано.

EMAIL='-e s/bar@baz.com//g'
EMAIL2='-e s/foo@bar.com//g;s/foo@bar.org//g'
echo "foo@bar.com foo@bar.org foo@baz.com bar@baz.com" | sed $EMAIL $EMAIL2
0
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

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