Мне сказали, что это было возможно, но без единственного рабочего примера, этого sed
может читать из строковой переменной без потребности во входном файле. Я должен все же заставить это работать. Для общей безопасности я пишу $PATH
переменная к другой переменной, поскольку я смешиваю с этим, потому что мне не нужны другие проблемы для возникновения, пока я не знаю точно, как сделать это.
Рассмотрите следующее:
~$x=$PATH
~$sed -i 's/:/ /g' $x
это перестало работать с: Никакой такой файл или каталог.
Вот некоторые другие, которых я судил:
~$ sed -i 's/:/ /g' | (read x)
sed: no input files
~$ sed -i 's/:/ /g' | (read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x)
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x)
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x))
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x))
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x))
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' | echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files
Это может даже работать? Я предпочел бы не должен писать файлы, в которых я не нуждаюсь именно так, я могу использовать sed. Для этого конкретного примера, если ~$x=$PATH ~$sed -i 's/:/ /g' $x
на самом деле проложил себе путь, я буду надеяться, я добрался бы:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games
который я мог затем присвоить переменной и использовать в будущих командах, как ls $x
Может быть:
~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games
Это не имеет ничего общего с sed
как таковым, оно применяется к любой программе, которая читает стандартный ввод. В любом случае, то, что вы искали, это
sed 's/:/ /g' <<<"$PATH"
Нет смысла сохранять в другой переменной, ничто из того, что вы делаете таким образом, не повлияет на значение, хранящееся в переменной. Для этого вам нужен оператор присваивания (=
). Синтаксис, использованный выше, называется «здесь строкой» и специфичен для bash, ksh и zsh. Он служит для передачи значения переменной в качестве ввода в программу, которая читает из стандартного ввода.
Я написал ответ на U & amp; L , в котором перечислены все различные операторы оболочки, подобные этому. Возможно, вы захотите взглянуть.
Обратите внимание, что вы могли бы также сделать
echo "$PATH" | sed 's/:/ /g'
Наконец, вам совсем не нужно sed
для этого. Вы можете сделать все это непосредственно в bash:
echo "${PATH//:/ }"
Выше приведена конструкция замены bash. Учитывая переменную $var
, шаблон pat
и замену (rep
), чтобы заменить все вхождения pat
на rep
, вы должны сделать
echo "${var//pat/rep}"
То же самое с одиночная косая черта заменяет только первое вхождение:
echo "${var/pat/rep}"