【问题标题】:Bash: remove substrings using ${string//substr/rep}Bash:使用 ${string//substr/rep} 删除子字符串
【发布时间】:2017-10-11 08:41:29
【问题描述】:

我正在尝试编写一个小的 shell 脚本,它可以读取文本文件(作为参数给出),删除所有无效的 Base64 字符,然后将此 Base64 字符串解码为可读的文本。

对于这个例子,我可以假设,我有一个有效的 Base64 字符串被额外的无效字符污染。所以简单地删除它们会使字符串再次有效。

我遇到了“删除所有无效字符”部分的问题。

这是我的脚本:

#!/bin/bash

args=("$@")
#echo ${args[0]}

# read file
STRING="$(cat ${args[0]})"
echo "Input:"
echo $STRING
echo "\n"

#BASE64_REGEX='!/[^A-Za-z0-9+\/=]/'
STRING=${STRING//[!?_-]/}
echo "Fixed:"
echo $STRING
echo "\n"

# decode String
DECODED=$(base64 -d <<< "$STRING")
echo "Decoded:"
echo $DECODED
echo "\n"

我认为我的问题是这里的这部分STRING=${STRING//[!?_-]/}。在此操作之后,字符串包含??___--- + 换行符,所以我必须以某种方式关闭。

编辑: 这将是示例字符串。我尝试删除所有字符,它们是 NOT Base64 字母的一部分。

!RGllIGVpbnppZ2VuIFNvbmRlc??nplaWNoZW4gaW0gQmFzZTY0IEFscGhhYmV0IHNpbmQgIisg_L_y_A9Ii4gQWxsZSB3ZWl0ZXJlbi-B-T-b25kZXJ6!ZWljaGVuICIhIsKnJCUiIGtvbW1!lbiBkb3J0IG5pY2h0IHZvci"4=

感谢您的帮助!

【问题讨论】:

  • 你能给我们实际的字符串以及你想用什么替换它吗?这些信息没有帮助。你的文件内容是什么?
  • 你想在这里删除什么?
  • 我添加了缺失的信息。对不起:)

标签: string bash substring


【解决方案1】:

这是因为 ! 在字符集中的第一个位置会像 ^ 一样反转集合(注意:仅适用于模式匹配(glob)而不是正则表达式匹配,但在这种情况下它只是模式匹配) 也许你想要

STRING=${STRING//[?\!_-]/}

为什么不用cmets中的集合

STRING=${STRING//[^A-Za-z0-9+\/=]/}

【讨论】:

  • 你完全正确。非常感谢。我永远不会发现这一点。
  • 请您解释一下为什么以及如何工作。我刚刚找到了答案。我的man bash 中的部分,但我不明白这如何与您的解决方案共同发生。 (对不起,我有点糊涂但愿意学习。)
  • @Scheff: !bash 中有一个特殊的含义来返回上一个命令,它需要在它之前用一个前导`` 进行转义。
  • @Scheff:${parameter/pattern/string}${parameter//pattern/string}的区别在于后者替换了pattern的所有出现,而前者替换了一次
  • @Scheff: ${parameter/pattern/string} Pattern substitution. ... If pattern begins with /, all matches of pattern are replaced with string.
猜你喜欢
  • 2017-11-04
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2019-08-10
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多