String 如何使用vim查找置换

String 如何使用vim查找置换,string,parsing,vim,sequence,String,Parsing,Vim,Sequence,我的问题是关于在VIM中解析和更改字符串。它有三个方面: 给定一串数字,我如何用另一个数字替换每个数字 例如,将1替换为3,将2替换为1,将3替换为2:123将变为312 一旦完成,我如何按数字顺序重新排列字符串中的数字 例如,541203变为145023 然后,按数字顺序重新排列字符串 例如,234012345123变为0121234345 下面是一行示例: 025, 056, 125, 235, 256, 257 正如您所看到的,元素中的每个数字都是正确排序的,元素也是有序的。但是,我需要

我的问题是关于在VIM中解析和更改字符串。它有三个方面:

  • 给定一串数字,我如何用另一个数字替换每个数字

    例如,将1替换为3,将2替换为1,将3替换为2:123将变为312

  • 一旦完成,我如何按数字顺序重新排列字符串中的数字

    例如,541203变为145023

  • 然后,按数字顺序重新排列字符串

    例如,234012345123变为0121234345

  • 下面是一行示例:

    025, 056, 125, 235, 256, 257
    
    正如您所看到的,元素中的每个数字都是正确排序的,元素也是有序的。但是,我需要按如下方式替换每个数字:

    0 -> 2
    1 -> 3
    2 -> 6
    3 -> 7
    4 -> 0
    5 -> 1
    6 -> 4
    7 -> 5
    
    一旦完成,每个元素的数量将是无序的,元素本身也是如此。然后,我需要完成步骤2和3,以创建一个“适当的”新元素列表

    对于许多不同的线路,我需要完成许多替换方案。手工操作需要很长时间,而且容易出错

    最后,当所有行的所有方案完成步骤1-3时,步骤4:删除重复安排。如果完成了步骤2-3,这是微不足道的


    我怎样才能让维姆帮我做这件事?甚至可以进行这种文本编辑吗?

    首先,步骤1通常是shell命令
    tr
    的工作,它作为一个函数存在于vim中:

    :let @q=tr(expand("<cword>"), "0123", "2367")
    
    :让@q=tr(展开(“”、“0123”、“2367”)
    

    将光标下编号的修改版本存储在寄存器
    q
    中。但是,它不是Vim命令,因此您必须编写一个函数来使用它。Perl或python可能比Vim更适合您的目的。

    为了让您开始,步骤1通常是shell命令的工作
    tr
    ,它作为一个函数存在于Vim中:

    :let @q=tr(expand("<cword>"), "0123", "2367")
    
    :让@q=tr(展开(“”、“0123”、“2367”)
    

    将光标下编号的修改版本存储在寄存器
    q
    中。但是,它不是Vim命令,因此您必须编写一个函数来使用它。Perl或python可能比Vim更适合您的目的。

    使用
    :s
    替换部分中的
    \=
    来执行Vim表达式

    :%s/\d\+/\=join(sort(split(tr(submatch(0), '01234567', '23670145'), '\zs')), '')/g
    :%s/.*/\=join(sort(split(submatch(0), ', ')), ', ')
    
    您还可以将Tim Pope的插件用于的
    :Subvert
    命令,而不是
    tr()
    。e、 g.
    :%S/{0,1,2,3,4,5,6,7}/{2,3,6,7,0,1,4,5}/g

    有关更多帮助,请参阅:

    :h :s\=
    :h sort(
    :h join(
    :h split(
    :h tr(
    

    使用更换零件中的
    \=
    执行vim表达式

    :%s/\d\+/\=join(sort(split(tr(submatch(0), '01234567', '23670145'), '\zs')), '')/g
    :%s/.*/\=join(sort(split(submatch(0), ', ')), ', ')
    
    您还可以将Tim Pope的插件用于的
    :Subvert
    命令,而不是
    tr()
    。e、 g.
    :%S/{0,1,2,3,4,5,6,7}/{2,3,6,7,0,1,4,5}/g

    有关更多帮助,请参阅:

    :h :s\=
    :h sort(
    :h join(
    :h split(
    :h tr(
    

    我同意在vim中这样做可能会带来更多的麻烦。以下是使用常用命令行工具的完整解决方案:

    #!/bin/sh
    
    echo "025, 056, 125, 235, 256, 257" |
    tr 01234567 23670145 | awk -F", " '{
        for (i=1; i<=NF; i++) {
            split($i, digits, "")
            n=asort(digits)
            for (x=1; x<=n; x++) {
                printf("%s",digits[x])
            }
            printf("\n")
        }
    }' | sort -n |
    sed ':a;N;$!ba;s/\n/, /g'
    
    #/垃圾箱/垃圾箱
    回声“0256125235256257”|
    tr 01234567 23670145 | awk-F“{
    
    对于(i=1;i我同意在vim中这样做可能会带来更多麻烦。下面是使用常用命令行工具的完整解决方案:

    #!/bin/sh
    
    echo "025, 056, 125, 235, 256, 257" |
    tr 01234567 23670145 | awk -F", " '{
        for (i=1; i<=NF; i++) {
            split($i, digits, "")
            n=asort(digits)
            for (x=1; x<=n; x++) {
                printf("%s",digits[x])
            }
            printf("\n")
        }
    }' | sort -n |
    sed ':a;N;$!ba;s/\n/, /g'
    
    !/bin/sh
    回声“0256125235256257”|
    tr 01234567 23670145 | awk-F“{
    
    对于(i=1;这听起来像是一个比文本编辑器更适合快速
    Python
    脚本的任务,尽管我很好奇人们会想出什么。上次我在
    Vim
    中尝试做这种复杂的事情时,我在一小时后放弃了,花了10分钟来编写Python。我认为这是一个比“怎么做?”是“为什么?”?".这是一个家庭作业练习吗?一个自我分配的练习…我正在尝试学习高级vim功能。所有被认为是脚本的东西可能更容易,但通过这种方式我可以了解更多关于vim的信息。这听起来像是一项比文本编辑器更适合快速
    Python
    脚本的任务,尽管我很想看看人们想到了什么h、 上次我试图在Vim中做这种复杂的事情时,我在一个小时后放弃了,花了10分钟来编写Python。我认为比“如何”更重要的问题是“为什么?”.这是一个家庭作业练习吗?一个自我分配的练习…我正在尝试学习vim的高级功能。所有被认为是脚本的东西可能更容易,但通过这种方式我可以了解更多关于vim的信息。这是一个非常好的答案--非常感谢。我正在尝试学习vim的更高级功能,但在将它们组合在一起进行测试时遇到了困难nything有用。这当然非常有效。这是一个非常好的答案——非常感谢。我正在尝试学习VIM的更高级功能,但在将它们组合起来做任何有用的事情时遇到了困难。这当然非常有效。