ChatGPT解决这个技术问题 Extra ChatGPT

在 Bash 中用另一个字符替换一个字符

我需要用 bash 中的字符串中的点 (.) 替换空格 ( )。

我认为这会很简单,但我是新手,所以我不知道如何修改类似的例子来使用。


B
Brian Clapper

使用内联 shell 字符串替换。例子:

foo="  "

# replace first blank only
bar=${foo/ /.}

# replace all blanks
bar=${foo// /.}

有关详细信息,请参阅 http://tldp.org/LDP/abs/html/string-manipulation.html


虽然这种解决方案在处理短字符串时很好(我猜是常见情况),但对于长字符串,可能更喜欢 tr。在我的系统上,从超过 1000 个字符的字符串开始,tr 的性能优于 bash。似乎 bash 的时间复杂度比线性的要差。一个小测试:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"。字符串长度为 1M (=2^20) 时,tr 占用了 0.04s,而 bash 5.0.11 占用了 17s。使用 2M,tr 花费了 0.07s(预期),但 bash 花费了 69s(字符串长度的 4 倍)。
@Socowi 使用存储在变量中的 1Mb 并不常见!高达 10Kb 以上,bash 似乎比 fork 到 tr 更快!...取决于可用内存和硬件资源...但您是对的!:根据要执行的工作类型,专用工具保持更高效!
对于换行符等转义字符,请务必搜索 $'\n'
a
aioobe

您可以使用 tr,如下所示:

tr " " .

例子:

# echo "hello world" | tr " " .
hello.world

man tr

描述 转换、压缩和/或删除标准输入中的字符,写入标准输出。


虽然这适用于被问到的问题,但它不如公认的答案通用(适用于字符替换和任意字符串),并且它还涉及外部命令。
另一方面,它适用于 2gb 文件,而无需将整个文件加载到内存中。
问题是关于“bash 中的字符串”,而不是任意大的文件。
这个还有另一个优点,我们不需要定义变量,可以很容易地在 bash 命令中使用。
G
Gilles 'SO- stop being evil'

在 bash 中,您可以使用 ${VARIABLE//PATTERN/REPLACEMENT} 构造在字符串中执行 pattern replacement。仅使用 / 而不是 // 仅替换第一个匹配项。该模式是通配符模式,如文件 glob。

string='foo bar qux'
one="${string/ /.}"     # sets one to 'foo.bar qux'
all="${string// /.}"    # sets all to 'foo.bar.qux'

R
Rob

尝试这个

 echo "hello world" | sed 's/ /./g' 

F
Fritz G. Mehner

使用参数替换:

string=${string// /.}

s
serenesat

试试这个路径:

echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'

它将双引号字符串中的空格替换为 + sing,然后将 + 符号替换为反斜杠,然后删除/替换双引号。

我不得不用它来替换我在 Cygwin 中的一条路径中的空格。

echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'

已经有一个两年前的答案可以解决 sed 的问题。引号无关紧要。
J
Juliano Costa

shellcheck 推荐的解决方案如下:

string="Hello World" ; echo "${string// /.}"
output: Hello.World