运行以下命令:
echo "hello-world" | tr "hello-world" "Hello World"
返回Heddd-ddddd
。我想让它回来Hello World
。我相信这是因为tr
将参数解释SET1
为范围(来自tr
联机帮助页):
CHAR1-CHAR2
all characters from CHAR1 to CHAR2 in ascending order
我也尝试过:
echo ${"hello-world//hello-world/Hello World"}
返回:
bash: ${"hello-world//hello-world/Hello World"}: bad substitution
执行此操作的首选方法是什么(将字符串的所有实例转换为不同的字符串)?使用tr
或其他程序。
答案1
只是我们需要逃离-
echo "hello-world" | tr "hello\-world" "Hello World"
幸运的是,我们在上下文中没有尾随h
或w
来给出有线结果。因此,最好将每个字符串的第一个字符替换为大写。
使用sed
echo "hello-world" | sed 's/-/ /g;s/\<./\U&/g'
答案2
你可以
- 将连字符转换为
tr
将每个单词中的第一个字母转换为大写(并打印每个单词的其余部分
($i,2)
而不进行任何转换)awk
$ echo 'hello-world-peace' | tr '-' ' ' | \ awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }} {print}' Hello World Peace
您也可以用于awk
整个任务,
- 将连字符转换为
gsub
- 将每个单词中的第一个字母转换为大写
toupper
并打印每个单词的其余部分
($i,2)
而不进行任何转换echo 'hello-world-peace' | \ awk '{gsub("-"," "); for(i=1;i<=NF;i++) \ { $i=toupper(substr($i,1,1)) substr($i,2) }} {print}'
答案3
这sed
会起作用:
echo "hello-world" |sed -E -n 's/.(.*)-.(.*)/H\1 W\2/p'
输出:
Hello World