Regex 如何修复此脚本以获得正确的输出?

Regex 如何修复此脚本以获得正确的输出?,regex,bash,Regex,Bash,大家好,我正在编写一个处理文本的脚本,文本如下所示: "TW|223SDSDr33|Archive" "Yes" "TW|ASFFSDFSFASDFS|Name" "LOCALggr" "TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" "" "TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf" "TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported" "TW|AFFSDFAASFSA|AFF

大家好,我正在编写一个处理文本的脚本,文本如下所示:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
其思想是按如下方式运行此代码:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
期望的输出是这样的:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "hola"
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "hola"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
标志--string1后面的第一个参数是一个字符串,我们希望在将要更改的行中找到该字符串后面的值,带引号的值,标志--string2后面的值是新值,标志--text后面的值是包含信息的文件名,为了实现这一点,我尝试了以下方法:

#!/bin/bash
function menu () {
        while (($# >= 1))
        do
        key="$1"
        case $key in
                --text)
                text=$2
                shift
                ;;
                --string1)
                string1=$2
                shift
                ;;
                --string2)
                string2=$2
                shift
                ;;
        esac
        shift
        done
}
function replaceString () {
        cat "$1" | sed -e 's/\("[\w\|]+\|'"$2"'"\) "[\w ]*"/\1 '\""$3"\"'/g' > newText.txt
        cat newText.txt
}
menu "$@"
replaceString $text $string1 $string2
我按如下方式运行:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt
我得到:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "hola"
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
我按照自己的意愿成功地更改了一行,但只有一行,我想更改与示例中条件相同的所有行,我还制作了其他破坏代码的示例,如下所示:

bash script.sh --string1 AFFCharSet --string2 hola --text text.txt
我得到:

"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "hola"
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"
"TW|223SDSDr33|Archive" "Yes"
"TW|ASFFSDFSFASDFS|Name" "LOCALggr"
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" ""
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf"
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported"
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst"
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test"
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs"
"TW|sfasfsSFSAFAS|AFFCharSet" "13A"
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"

脚本没有任何更改,我不知道这是否是与我的正则表达式相关的问题,我希望得到任何修复代码的建议。

这是一个简短的脚本:

#!/usr/bin/bash

sed "s/|\($1\" \)\"[^\"]*\"/\1\"$2\"/g" $3
用法:
/script.sh AFFICCheckCtlNo hola text2.txt

说明:

  • “s///g”
    替换文本并传递变量
  • \\($1\“\)\“[^\“]*\”
    与右行匹配。在取消和替换之后,它将看起来像这样
    \\(粘贴checkctlno“\)“[^”]*”
  • 在括号中,我们捕获了要重复的部分
  • 替换的
    \1\“$2\”
    由记忆的部分组成,如
    | AFFICLstRcvdCtlNo“
    ,然后添加
    “yourstring”
    ,如
    “hola”

  • sed
    不支持
    \w
    。请改用
    [:alnum:][/code>(如果支持)

    此外,我的sed版本需要将
    +
    反斜杠以使其与字面上的不匹配,并将
    |
    反斜杠(这里不是指“可选”)


    谢谢这真的很有帮助我真的很感谢你的支持。