【问题标题】:trim junk characters from variable从变量中修剪垃圾字符
【发布时间】:2009-10-27 05:14:38
【问题描述】:

我的 shell 脚本中有一个变量可以按照我的预期工作。 但是当我使用该变量作为文件名时,我得到 ??在字符串的开头。如何修剪垃圾字符?

我使用 $(some command) 来创建这个变量。

【问题讨论】:

    标签: unix shell


    【解决方案1】:

    修复变量的方法有很多种,但首先我们需要知道要删除什么(即someCommand 的输出)。

    例如,如果它总是在前面放置两个您不需要的字符,您可以使用:

    x=$(someCommand | cut -c3-)
    

    如果您想去除输出中 0x20 到 0x7e 范围之外的所有字符(ASCII 中的不可打印字符),您可以使用:

    x=$(someCommand | tr -d '[\000-\037\177]')
    

    理想情况下,您应该运行 someCommand | od -xcb 来获取其输出内容的实际十六进制转储。然后我们可以进一步帮助您。

    更新:

    根据您的新数据(输出为\n\nSomeName27-Oct-2009-14-33.sql.zip),您应该能够使用sed '/^$/d' 去除空行。

    pax> echo '
    
    SomeName27-Oct-2009-14-33.sql.zip' | od -xcb
    
    0000000 0a0a 6f53 656d 614e 656d 3732 4f2d 7463
             \n  \n   S   o   m   e   N   a   m   e   2   7   -   O   c   t
            012 012 123 157 155 145 116 141 155 145 062 067 055 117 143 164
    0000020 322d 3030 2d39 3431 332d 2e33 7173 2e6c
              -   2   0   0   9   -   1   4   -   3   3   .   s   q   l   .
            055 062 060 060 071 055 061 064 055 063 063 056 163 161 154 056
    0000040 697a 0a70
              z   i   p  \n
            172 151 160 012
    0000044
    
    pax> echo '
    
    SomeName27-Oct-2009-14-33.sql.zip' | sed '/^$/d' | od -xcb
    
    0000000 6f53 656d 614e 656d 3732 4f2d 7463 322d
              S   o   m   e   N   a   m   e   2   7   -   O   c   t   -   2
            123 157 155 145 116 141 155 145 062 067 055 117 143 164 055 062
    0000020 3030 2d39 3431 332d 2e33 7173 2e6c 697a
              0   0   9   -   1   4   -   3   3   .   s   q   l   .   z   i
            060 060 071 055 061 064 055 063 063 056 163 161 154 056 172 151
    0000040 0a70
              p  \n
            160 012
    0000042
    

    假设那些\n 标记实际上是两个 换行符({'\n','\n'})。如果(出于某种奇怪的原因)它们是 四个 字符 {'\\','n','\\','n'},请改用 cut -c5-

    【讨论】:

    • \n\nSomeName27-Oct-2009-14-33.sql.zip ## 我想删除前 2 个换行符。
    • sed '/^$/d' ## 谢谢。我还有一个问题。我如何也删除两个单词之间的空格?一些名称27-Oct-2009-14-33.sql.zip
    • 使用 "sed 's/ //g'" 删除所有空格(这是前两个 "/" 字符之间的空格,以防它不是很明显)。您可以将其与其他 sed 组合如下:“sed -e '/^$/d' -e 's/ //g'”。
    【解决方案2】:

    我建议的一种简单方法是使用带有 -d 选项的 tr 命令来删除 ?


    文件名=$filename | tr -d '?'

    【讨论】:

      【解决方案3】:

      文件名=echo $filename | sed 's/\?//g

      【讨论】:

        猜你喜欢
        • 2020-08-29
        • 1970-01-01
        • 2011-01-21
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多