在Bash中将一个字符替换为另一个字符


223

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

我认为这将非常简单,但是我是新手,所以我不知道如何为此用途修改类似的示例。

Answers:


390

使用内联外壳字符串替换。例:

foo="  "

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

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

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


1
尽管这种解决方案在处理短字符串时很不错(我想这是常见的情况),但tr对于长字符串可能更喜欢。在我的系统上,trbash的性能优于以多个1000字符开头的字符串。好像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(四倍于字符串长度的两倍)。
Socowi

@Socowi使用存储在变量中的1Mb并不是很平常!高达10Kb以上,bash似乎比分叉要快tr!...取决于可用的内存和硬件资源...但是您是对的!:根据要执行的工作,专用工具可以保持更高的效率!
F. Hauri

对于换行符这样的转义字符,请确保搜索$'\n'
user2561747

75

您可以这样使用tr

tr " " .

例:

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

来自man tr

描述
     翻译,压缩和/或删除标准输入中的字符,写到标准输出。


尽管此方法适用于所问的问题,但它比接受的答案(适用于字符替换以及任意字符串)的通用性要低,并且还涉及到外部命令。
Dan Dascalescu

2
另一方面,它可以处理2gb文件,而无需将整个内容加载到内存中。
aioobe

问题是关于“ bash中的字符串”,而不是任意大文件。
Dan Dascalescu

52

在bash中,您可以使用该构造在字符串中进行模式替换${VARIABLE//PATTERN/REPLACEMENT}。使用just /而不是//只替换第一个匹配项。该模式是通配符模式,例如文件全局。

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

24

试试这个

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


4

尝试以下路径:

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

它用单引号替换双引号字符串内的空格+,然后用+反斜杠替换符号,然后删除/替换双引号。

我必须使用它来替换Cygwin中我的一条路径中的空格。

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

2
已经有两年历史的答案可以解决的问题sed。引号无关紧要。
chepner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.