有人告诉我这是可行的,但没有一个可行的例子,它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
答案1
这与此无关sed
,它适用于任何读取标准输入的程序。无论如何,你要找的是
sed 's/:/ /g' <<<"$PATH"
没有必要保存在另一个变量中,你这样做不会影响存储在变量中的值。你需要赋值运算符(=
)。上面使用的语法称为“此处字符串”并且特定于 bash、ksh 和 zsh。它用于将变量的值作为输入传递给从标准输入读取的程序。
我已经写了U&L 上的答案列出了所有类似这样的 shell 操作符。你可能想看一下。
请注意,你也可以这样做
echo "$PATH" | sed 's/:/ /g'
最后,你真的不需要这样做sed
。你可以直接在 bash 中完成所有操作:
echo "${PATH//:/ }"
以上是 bash 替换构造。给定一个变量$var
、一个模式pat
和一个替换 ( rep
),要用 替换所有出现的pat
,rep
您可以这样做
echo "${var//pat/rep}"
使用单个斜杠的相同内容仅替换第一次出现的内容:
echo "${var/pat/rep}"
答案2
或许:
~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games