【问题标题】:pipe char in rot13-like translate command splits word at piperot13-like translate 命令中的管道字符在管道处拆分单词
【发布时间】:2015-02-09 04:54:03
【问题描述】:

我有一个由 rotate13 启发的脚本,我想在其中将输入的字符串转换为预先确定但看似随机的输出字符串。这是我想用来从可读字符串转换为随机输出$pWCR 的两个命令,以及从(看似)随机字符串到原始可读字符串$pWCO 的免费转换命令。

pWCR=$(echo $origStr|tr 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>' '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S')

pWCO=$(echo $randStr|tr '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S' 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>')

所以问题是包含管道字符 | 的字符串包含在要翻译的任一字符串中导致字符串被拆分,实际上在管道字符处截断(而不是拆分),就好像它正在我猜读为逻辑或。但是因为它是在单引号内翻译的,所以我认为不应该对 char 进行字面解释。我试图逃避管道字符,但它没有明显的影响。

谁能在这里权衡一下,让我知道我的翻译命令哪里出错了。我可以简单地省略管道字符,但我想知道为什么在这种情况下必须省略它,当然更喜欢将它保存在字符池中进行翻译,这样用户就不会不必要地看到字符列表是无效的。单引号当然已经被排除在外,但如果可能的话,我想将排除的字符列表保留为那个字符。

更新:
@choroba:好的,感谢您指出该命令实际上在 CLI 上运行良好,这迫使我更仔细地查看处理变量 $origStr$randStr 的代码。

我正在使用yad 表单文本框来提示用户输入要翻译的字符串。在仔细检查yad 命令之前,我忘记了它使用管道字符“|”作为默认字段分隔符,因此是破解包含管道字符的输入字符串的罪魁祸首。

userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" " --form \
        --field="Enter random string to restore its readable value: " '' \
        --button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"

origStr=$(echo "$userDets"|sed -r 's/^([^|]*)\|.*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"

将分隔符更改为空格后,如下所示:

userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" --separator=" " --form \
        --field="Enter random string to restore its readable value: " '' \
        --button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"

    origStr=$(echo "$userDets"|sed -r 's/^([^ ]*) .*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"

脚本按需要运行。

【问题讨论】:

  • 你使用什么输入法?它对我有用。

标签: string bash tr


【解决方案1】:

我可以看到这两个语句的唯一问题是 $origStr 和 $randStr 没有用双引号括起来。

这会导致问题,并且可能会导致您的问题,但我无法准确复制您的描述。

【讨论】:

  • 我用单引号而不是双 b/c 双引号中的$ char 似乎被解释为变量指示符,但在单引号中被简单地解释为美元符号。
  • 我的意思是“echo”命令当前未引用的参数,而不是正确引用的 tr 命令。顺便说一句:您也可以通过在每个或 tr 单引号字符串中插入字符串 '"'"' 来放一个单引号;如果你能解码。 -> 单双单双单。
  • 热血!我尝试了相当长的一段时间来包含单引号,但无法正常工作。你的建议确实有效,所以谢谢你。为什么tr 不会在第二个单引号处解释输入字符串的结尾,而是将单引号括在双引号中,然后字符串的其余部分以另一个单引号继续?我希望读起来有点理解。
  • 进行引号拆分的是shell。该参数由三个带引号的字符串组成,第一个带单引号,第二个带双引号,最后一个带单引号。字符串连接在一起形成一个参数,该参数传递给 tr 因为它们在字符串之间没有空格。单引号之间没有特殊字符,因此每个字符('除外)都按字面意思解释。双引号之间有很多特殊字符,但单引号不是其中之一。如此“简单”(有点;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多