Regex 使用SED替换curlybrace并添加插入字符

Regex 使用SED替换curlybrace并添加插入字符,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我有一个由BASH脚本生成的“.csv”文件。在该脚本中,我有一个sed语句来对文件进行一些更改,该脚本仅在前一行输出。我正在尝试sed文件并删除/替换一些编码字符 我正在尝试将文件中的“{”替换为零“0”。此外,我需要在匹配之前加上“+” 以下是最近的一次尝试(以前的数百次尝试中):sed-r的/^(.*)([\{])(.*)$/\1\+0\3/g'-i“$FILENAME” 以下是我的数据示例: 4240880002,9000413542,001,000000000000000{,00000

我有一个由BASH脚本生成的“.csv”文件。在该脚本中,我有一个
sed
语句来对文件进行一些更改,该脚本仅在前一行输出。我正在尝试
sed
文件并删除/替换一些编码字符

我正在尝试将文件中的“{”替换为零“0”。此外,我需要在匹配之前加上“+”

以下是最近的一次尝试(以前的数百次尝试中):
sed-r的/^(.*)([\{])(.*)$/\1\+0\3/g'-i“$FILENAME”

以下是我的数据示例:

4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,F,BI,,,D,7391420002
令人沮丧的是,它似乎只匹配第一行,然后退出,尽管全局标志“/g”处于启用状态:

4240880002,9000413542,001,000000000000000+0,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,A,BI,,,C,7639840002
4240880002,9000413542,001,000000000000000{,000000000000011P,000000000000000{,000000000000011P,A,2006060000,,,F,BI,,,D,7391420002
下面是我试图格式化它的方式:(我包括了我的下一个字符替换p=7):

我的脑子都被这件事弄糊涂了!:(

我真诚地感谢你的帮助

更新 这是我使用的转换图表:

Character   Digit   Sign
{   0   +
A   1   +
B   2   +
C   3   +
D   4   +
E   5   +
F   6   +
G   7   +
H   8   +
I   9   +

}   0   -
J   1   -
K   2   -
L   3   -
M   4   -
N   5   -
O   6   -
P   7   -
Q   8   -
R   9   -

再次阅读后,这里是另一个使用
awk

$ awk 'BEGIN {FS=OFS=","} 
             {for(i=1;i<=NF;i++) 
                {if(gsub(/{/,0,$i)) $i="+"$i; 
                 if(gsub(/P/,7,$i)) $i="-"$i} }1' file

    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,F,BI,,,D,7391420002
$awk'开始{FS=OFS=“,”}

{for(i=1;i再次阅读后,这里是另一个使用
awk

$ awk 'BEGIN {FS=OFS=","} 
             {for(i=1;i<=NF;i++) 
                {if(gsub(/{/,0,$i)) $i="+"$i; 
                 if(gsub(/P/,7,$i)) $i="-"$i} }1' file

    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,A,BI,,,C,7639840002
    4240880002,9000413542,001,+0000000000000000,-0000000000000117,+0000000000000000,-0000000000000117,A,2006060000,,,F,BI,,,D,7391420002
$awk'开始{FS=OFS=“,”}

{for(i=1;i您的
sed
命令越来越近。需要更改两件事: 不匹配行的开头和结尾。 与非
的字符匹配。 你会得到

sed -r 's/,([^,]*)\{([^,])*/,+\10\2/g; s/,([^,]*)P([^,]*)/,-\17\2/g' "$FILENAME"

您的
sed
命令已接近。需要更改两件事: 不匹配行的开头和结尾。 与非
的字符匹配。 你会得到

sed -r 's/,([^,]*)\{([^,])*/,+\10\2/g; s/,([^,]*)P([^,]*)/,-\17\2/g' "$FILENAME"

天哪,用awk就行了:

$ cat tst.awk
BEGIN {
    mkmap("{ A B C D E F G H I","+")
    mkmap("} J K L M N O P Q R","-")
    FS=OFS=","
}
{
    for (i=1; i<=NF; i++) {
        for (char in map) {
            num = map[char]
            if ( sub(char,num,$i) ) {
                $i = pfx[char] $i
            }
        }
    }
    print
}
function mkmap(list,sign,       char,tmp,num) {
    split(list,tmp,/ /)
    for (num in tmp) {
        char = tmp[num]
        map[char] = num-1
        pfx[char] = sign
    }
}

如果一个字段中出现两个字符,您不会说该怎么做,因此idk如果我在上面所做的是您想要的还是不想要的,那么该代码应该足够简单,可以修改以执行您想要的任何操作,并添加您需要的任何其他转换。

好的,请使用awk:

$ cat tst.awk
BEGIN {
    mkmap("{ A B C D E F G H I","+")
    mkmap("} J K L M N O P Q R","-")
    FS=OFS=","
}
{
    for (i=1; i<=NF; i++) {
        for (char in map) {
            num = map[char]
            if ( sub(char,num,$i) ) {
                $i = pfx[char] $i
            }
        }
    }
    print
}
function mkmap(list,sign,       char,tmp,num) {
    split(list,tmp,/ /)
    for (num in tmp) {
        char = tmp[num]
        map[char] = num-1
        pfx[char] = sign
    }
}
如果一个字段中出现2个字符,您不会说该怎么做,因此idk如果我在上面所做的是您想要的还是不想要的,那么代码应该足够简单,可以修改以执行您想要的操作,并添加您需要的任何其他转换。

这可能适合您(GNU-sed):

首先在包含翻译编码的字段前面插入
+
-
。然后翻译编码。

这可能适用于您(GNU-sed):


首先在包含翻译编码的字段前面插入
+
-
。然后翻译编码。

从转换图表中提取+0-0+1-1,应该可以。

从转换图表中提取+0-0+1-1,应该可以。

我真的很感谢所有的帮助!你们都帮了我很忙ose。最后,这就是最终解决问题的方法。谢谢

        #!/bin/bash
    function FixEncodedStrings(){
    if [[ "$1" =~ ([0-9]{3,})\{([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})\{([0-9]{1,})?/+\10\2/g'
    elif [[ "$1" =~ ([0-9]{3,})A([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})A([0-9]{1,})?/+\11\2/g'
    elif [[ "$1" =~ ([0-9]{3,})B([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})B([0-9]{1,})?/+\12\2/g'
    elif [[ "$1" =~ ([0-9]{3,})C([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})C([0-9]{1,})?/+\13\2/g'
    elif [[ "$1" =~ ([0-9]{3,})D([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})D([0-9]{1,})?/+\14\2/g'
    elif [[ "$1" =~ ([0-9]{3,})E([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})E([0-9]{1,})?/+\15\2/g'
    elif [[ "$1" =~ ([0-9]{3,})F([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})F([0-9]{1,})?/+\16\2/g'
    elif [[ "$1" =~ ([0-9]{3,})G([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})G([0-9]{1,})?/+\17\2/g'
    elif [[ "$1" =~ ([0-9]{3,})H([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})H([0-9]{1,})?/+\18\2/g'
    elif [[ "$1" =~ ([0-9]{3,})I([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})I([0-9]{1,})?/+\19\2/g'
    elif [[ "$1" =~ ([0-9]{3,})\}([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})\}([0-9]{1,})?/-\10\2/g'
    elif [[ "$1" =~ ([0-9]{3,})J([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})J([0-9]{1,})?/-\11\2/g'
    elif [[ "$1" =~ ([0-9]{3,})K([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})K([0-9]{1,})?/-\12\2/g'
    elif [[ "$1" =~ ([0-9]{3,})L([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})L([0-9]{1,})?/-\13\2/g'
    elif [[ "$1" =~ ([0-9]{3,})M([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})M([0-9]{1,})?/-\14\2/g'
    elif [[ "$1" =~ ([0-9]{3,})N([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})N([0-9]{1,})?/-\15\2/g'
    elif [[ "$1" =~ ([0-9]{3,})O([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})O([0-9]{1,})?/-\16\2/g'
    elif [[ "$1" =~ ([0-9]{3,})P([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})P([0-9]{1,})?/-\17\2/g'
    elif [[ "$1" =~ ([0-9]{3,})Q([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})Q([0-9]{1,})?/-\18\2/g'
    elif [[ "$1" =~ ([0-9]{3,})R([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})R([0-9]{1,})?/-\19\2/g'
    fi
    }

我真的很感谢你们的帮助!你们都帮助我走得很近。最后,这就是最终解决问题的原因。谢谢

        #!/bin/bash
    function FixEncodedStrings(){
    if [[ "$1" =~ ([0-9]{3,})\{([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})\{([0-9]{1,})?/+\10\2/g'
    elif [[ "$1" =~ ([0-9]{3,})A([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})A([0-9]{1,})?/+\11\2/g'
    elif [[ "$1" =~ ([0-9]{3,})B([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})B([0-9]{1,})?/+\12\2/g'
    elif [[ "$1" =~ ([0-9]{3,})C([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})C([0-9]{1,})?/+\13\2/g'
    elif [[ "$1" =~ ([0-9]{3,})D([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})D([0-9]{1,})?/+\14\2/g'
    elif [[ "$1" =~ ([0-9]{3,})E([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})E([0-9]{1,})?/+\15\2/g'
    elif [[ "$1" =~ ([0-9]{3,})F([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})F([0-9]{1,})?/+\16\2/g'
    elif [[ "$1" =~ ([0-9]{3,})G([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})G([0-9]{1,})?/+\17\2/g'
    elif [[ "$1" =~ ([0-9]{3,})H([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})H([0-9]{1,})?/+\18\2/g'
    elif [[ "$1" =~ ([0-9]{3,})I([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})I([0-9]{1,})?/+\19\2/g'
    elif [[ "$1" =~ ([0-9]{3,})\}([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})\}([0-9]{1,})?/-\10\2/g'
    elif [[ "$1" =~ ([0-9]{3,})J([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})J([0-9]{1,})?/-\11\2/g'
    elif [[ "$1" =~ ([0-9]{3,})K([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})K([0-9]{1,})?/-\12\2/g'
    elif [[ "$1" =~ ([0-9]{3,})L([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})L([0-9]{1,})?/-\13\2/g'
    elif [[ "$1" =~ ([0-9]{3,})M([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})M([0-9]{1,})?/-\14\2/g'
    elif [[ "$1" =~ ([0-9]{3,})N([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})N([0-9]{1,})?/-\15\2/g'
    elif [[ "$1" =~ ([0-9]{3,})O([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})O([0-9]{1,})?/-\16\2/g'
    elif [[ "$1" =~ ([0-9]{3,})P([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})P([0-9]{1,})?/-\17\2/g'
    elif [[ "$1" =~ ([0-9]{3,})Q([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})Q([0-9]{1,})?/-\18\2/g'
    elif [[ "$1" =~ ([0-9]{3,})R([0-9]{1,})? ]]
        then
            echo "$1" | sed -r 's/([0-9]{3,})R([0-9]{1,})?/-\19\2/g'
    fi
    }


每行的开头真的有四个空格吗?不,这只是stackoverflow格式。在数字开始之前,行的开头没有前导字符。在这种情况下,请删除它们。更新。感谢您的观察。每个字段最多有一个字符要替换吗?或者您希望
,0{PP}{P}的符号/输出是什么,
每行的开头真的有四个空格吗?不,这只是stackoverflow格式。在数字开始之前,行的开头没有前导字符。在这种情况下,请删除它们。更新。感谢您的观察。每个字段最多有一个字符要替换吗?或者您希望
,0{PP}使用什么符号/输出{P} ,
Wow!太棒了……让我看看这是否有效。我想我可以用相同的“if(gsub)”语法加载我的其他角色转换。给我几分钟。我想我把你的工作搞糟了。当合并到脚本中时,它只是挂在awk语句上(debug)@karakfa,我们可以聊天吗?哇!太棒了…让我看看这是否有效。我想我可以用相同的“if(gsub)”语法加载我的其他角色转换。给我几分钟。我想我把你的工作搞糟了。当合并到脚本中时,它只是挂在awk语句上(debug)我们可以聊天吗?不幸的是,这不起作用。这匹配了每一列,并将每一个结果附加上一个“+”或“-”或“-”或“-+”。@karakkfa@karakfa。这是匹配了每一个列,并将每一个结果附加上一个“++或”或“+---“或”或“----””,。这是我所尝试的。这是我尝试的。这是我尝试的以下以下以下。我尝试的以下以下是我尝试:以下以下以下我尝试:以下我尝试:s/:s/以下以下以下:s/以下:s/以下:s/,以下我尝试:s/,以下我尝试:s/,以下我尝试:s/,以下尝试:s/,以下:s/,,(s/,,(,(,(,(,(,(,(,((((((^,,,,,,,,,,,,,,,,,,,,,,,,,,g;s/,([^,]*)\E([^,]*/(3)目前的2/g;s/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]*)\K([^,]*)/,-\12\2/g;s/,([^,]*)\L([^,]*)/,-\13\2/g;s/,([^,]*)\M([^,]*)/,-\14\2/g;s/,([^,]*)\N([^,]*)/,-\15\2/g;s/,([^,]*)\O([^,]*)/,-\16\2/g;s/,([^,]*)\(3)Q(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月,(3)月(3)月(3)月,(3)月,(3)月,(3)月,(3)月,(3)月,(3)月,(3)月(3)月,(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)月(3)日,(3)月(3)月(3)日,(3)月(3)日,,,,,,,,,,,,,,))月(3)月(3)月(3)月(3)月(3)月[^,]*)/,+\11\2/g s/,([^,]*)\B([^,]*)/3.2/g s/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[^,]*)/,-\14\2/g'-i“$FILENAME”不幸的是,这项工作没有起作用。这项工作匹配了每一列,并将每一个结果附加了一个“+”或“-”或“-”或“--”或“-++”…这项工作匹配了每一列,并将每一列匹配了每一列,并将每一个结果附加了一个“++或”或“----“或”或”或”或“或”或”或”或”或”或“-++++++++“……这……这是我所做的工作。这是我试的以下以下以下以下以下以下我所做的我试的是我试的以下以下以下以下我试的以下以下以下以下以下以下以下我试了我试过的以下以下以下以下以下:我试过的是我尝试:以下我尝试:s::s/,以下以下我试过:s/,以下以下我尝试:s/,以下我尝试:s/,以下以下以下以下我尝试:s/,以下以下以下以下以下*)\E([^,]]*/,+\15\2/g;s/,([^,]*)\F([^,]]*/,+\16\2/g;s/,([^,]*)\g([^,]*)*/,+\17\2/g;s/,([^,]*)\H([^,]*)*/,+\18\2/g;s/,([^,]*