替换包含连字符的字符串的所有实例

替换包含连字符的字符串的所有实例

运行以下命令:

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"

幸运的是,我们在上下文中没有尾随hw来给出有线结果。因此,最好将每个字符串的第一个字符替换为大写。

使用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

相关内容