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版本需要将+
反斜杠以使其与字面上的不匹配,并将|
反斜杠(这里不是指“可选”)
谢谢这真的很有帮助我真的很感谢你的支持。