大家好,我正在编写一个处理文本的脚本,文本如下所示:
"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"