Используйте sed на строковой переменной, а не файле

Мне сказали, что это было возможно, но без единственного рабочего примера, этого 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

29
задан 11 March 2015 в 00:36

2 ответа

Может быть:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games
16
ответ дан 23 November 2019 в 00:52

Это не имеет ничего общего с 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}"
37
ответ дан 23 November 2019 в 00:52

Другие вопросы по тегам:

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