【问题标题】:Bash saving a tr manipulated StringBash 保存 tr 操作的字符串
【发布时间】:2016-01-28 18:03:39
【问题描述】:

我有一个小程序询问用户的名字和姓氏。我需要将给定姓氏的最后一个字符更改为名字和姓氏中的下划线(以及字符串中任何出现的下划线)。我还需要将用户的名字更改为大写字母。我得到了这部分代码,我在其中操作给定的字符串。

echo -n "Hello "
X="$X" | tr ${Y:(-1)} "_"
echo -n "${X^^}"
echo " $Y" | tr ${Y:(-1)} "_"

出于某种原因,第 2 行:X="$X" | tr ${Y:(-1)} "_" 不会像我想要的那样保存变量。例如,当我填写"Cannon Nikkon" 时,程序返回"Hello CANNON Nikko_"。但是当我打印echo "$X" | tr ${Y:(-1)} "_" 时,它会打印"Hello Ca__o_ Nikko_"。我试图用写echo "${X^^}" | tr ${Y:(-1)} "_" 来解决它,但它仍然返回"Hello CANNON Nikko_"。我发现因为 n 和 N 不是相同的字符,所以它不会改变。

但是为什么它不保存第 2 行中的变量呢?我需要如何解决这个问题?

【问题讨论】:

  • 当然第 2 行没有;赋值语句不产生输出,因此管道不读取任何内容。此外,您在子shell 中设置X,一旦管道完成,该子shell 就会退出。

标签: string bash replace character


【解决方案1】:

如果我理解正确, 而不是这个:

X="$X" | tr ${Y:(-1)} "_"

你想这样做:

X=$(tr ${Y:(-1)} "_" <<< "$X")

也就是说,您要将tr 的输出写回X。 最初的声明根本没有这样做, 它做了一些完全不同的事情:

  1. X的值设置为"$X"
  2. 将分配的输出(无)传送到tr

tr的输出被打印出来,并没有保存在X中, 与你可能相信的相反。

【讨论】:

  • ^^ 表示每个匹配模式都大写(如果省略,则默认为?),因此first_initial 不是必需的。只需使用${first^}
  • @janos 是的,感谢您的回答。我来自 java,我是 Bash 的新手。我现在了解如何正确保存带有 tr 的操纵字符串。
【解决方案2】:

使用正确的工具更改字符串${//}

first="jason";
echo "${first/%?/_}"     ### Using % means: "at the end of the string".

一个完整的变化将是:

first="jason";
first="${first/%?/_}"
first="${first^}"              ### Use ^^ to change all the string.
echo "$first"

并且,询问用户将是:

#!/bin/bash
read -rp "Your first name, please: ? " first
read -rp "Your Last  name, please: ? " last
first="${first/%?/_}"
first="${first^}"
last="${last/%?/_}"
last="${last^}"
echo "$first $last"

【讨论】:

  • 谢谢,我已经读完了阅读部分。但是我之前编辑了这个问题,说需要替换找到的最后一个字符,并且字符串中的所有其他字符都需要替换为它。
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2013-05-02
  • 2015-04-04
  • 2020-03-27
  • 2018-01-11
  • 2020-05-03
相关资源
最近更新 更多