对字符串变量而不是文件使用 sed

对字符串变量而不是文件使用 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

答案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),要用 替换所有出现的patrep您可以这样做

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

相关内容