如何通过Python 3中作为命令行参数提供的转义序列拆分UTF-8字符串?

如何通过Python 3中作为命令行参数提供的转义序列拆分UTF-8字符串?,python,string,split,command-line-arguments,ansi-escape,Python,String,Split,Command Line Arguments,Ansi Escape,我试图用一个分隔符来分隔UTF-8字符串,该分隔符在Python3中作为命令行参数提供。制表符“\t”应为有效选项。不幸的是,我没有找到任何解释转义序列的方法。我写了一个名为“test.py”的小测试脚本 我尝试按如下方式运行该脚本(在kubuntu linux主机上的guake shell中): python3 test.py\t python3 test.py\t python3 test.py'\t' python3 test.py“\t” 这两种解决方案都不起作用。我还尝试了一个包含“真

我试图用一个分隔符来分隔UTF-8字符串,该分隔符在Python3中作为命令行参数提供。制表符“\t”应为有效选项。不幸的是,我没有找到任何解释转义序列的方法。我写了一个名为“test.py”的小测试脚本

我尝试按如下方式运行该脚本(在kubuntu linux主机上的guake shell中):

  • python3 test.py\t
  • python3 test.py\t
  • python3 test.py'\t'
  • python3 test.py“\t”
  • 这两种解决方案都不起作用。我还尝试了一个包含“真实”(不幸的是机密数据)的较大文件,由于某些奇怪的原因,在许多(但并非所有)情况下,在使用第一次呼叫时,线路被正确分割


    让Python 3将命令行参数解释为转义序列而不是字符串的正确方法是什么?

    至少在Linux上的Bash中,uou需要使用
    CTRL+V
    +
    选项卡

    示例:

    python utfsplit.py '``CTRL+V TAB``'
    
    否则,您的代码将起作用:

    $ python3.4 utfsplit.py '       '
    
    ['12345', 'ktktktk']
    ['633', 'bgt']
    

    NB:这里不能真正显示制表符:)

    您可以使用
    $

    python3 test.py $'\t'
    

    对形式为$'string'的单词进行特殊处理。单词扩展为字符串,并按照ANSI C标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)解码如下:

    当您希望为某些程序提供特殊字符作为参数时,这尤其有用,例如为sed提供换行符

    结果文本被视为是单引号。没有进一步的扩张发生

    $“…”语法来自ksh93,但可移植到包括pdksh在内的大多数现代shell中。SUS第7版接受了其规范。仍然有一些掉队者,比如包括dash在内的大多数ash变体(除了使用“bash兼容性”特性构建的busybox)

    或者使用python:

     arg = bytes(sys.argv[1], "utf-8").decode("unicode_escape")
    
    print(arg)
    
    l1 = u"12345\tktktktk".split(arg)
    print(l1)
    
    l2 = u"633\tbgt".split(arg)
    print(l2)
    
    输出:

    $ python3 test.py $'\t'
        
    ['12345', 'ktktktk']
    ['633', 'bgt']
    
    $ python3 test.py '\t'
        
    ['12345', 'ktktktk']
    ['633', 'bgt']
    

    请注意投票反对的人。这实际上是一种有效的方法,确实有效。尽管@Padraic Cunningham的反应要好得多!这种方法在本地系统上也很有效,但正如James所说,Padraics的响应更好,特别是在使用PuTTY这样的终端客户端时。无论如何,谢谢你和a+1给了我一个正确的解决方案。太棒了,很有魅力,谢谢你。我将此标记为详细解释的正确解决方案,并提供了两种不同的解决方案,一种是基于shell的解决方案,另一种是基于python的解决方案。回答得不错!不知道Bash中传递参数的特殊形式:)很好@诺里特,不用担心,很高兴这有帮助。
     arg = bytes(sys.argv[1], "utf-8").decode("unicode_escape")
    
    print(arg)
    
    l1 = u"12345\tktktktk".split(arg)
    print(l1)
    
    l2 = u"633\tbgt".split(arg)
    print(l2)
    
    $ python3 test.py '\t'
        
    ['12345', 'ktktktk']
    ['633', 'bgt']