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



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

"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

所需的输出是这样的:

"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

我按如下方式运行它:

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"

我如愿以偿地成功更改了一行,但只有一行,我想更改与示例中具有相同条件的所有行,我还制作了其他示例破坏我的代码:

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" ""
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf"
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs"

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

sed

不支持w。请改用[:alnum:](如果支持)。

此外,我的 sed 版本需要反斜杠+以使其与字面上不匹配,也不反斜杠|(这里并不意味着"替代")。

sed -e 's/("[[:alnum:]|]+|'"$2"'") "[[:alnum:] ]*"/1 "'"$3"'"/g' 

这是一个简短的脚本:

#!/usr/bin/bash
sed "s/|($1" )"[^"]*"/1"$2"/g" $3

用法:./script.sh AFFICCheckCtlNo hola text2.txt

解释:

  • "s///g"替换文本并传递变量
  • |($1" )"[^"]*"与正确的行匹配。取消转义和替换后,它将看起来像这样|(AFFICCheckCtlNo " )"[^"]*"
  • 在括号中,我们捕获要重复的部分
  • 替换1"$2"由记住的部分组成,如|AFFICLstRcvdCtlNo",然后添加"yourstring",如"hola"

相关内容

  • 没有找到相关文章

最新更新