编写一个简单的脚本来备份一些IDE设置并学习bash脚本。
以下是我到目前为止所拥有的:
#!/bin/bash
NEWLINE=我能够获得一些在https://www.regextester.com和https://regexr.com上工作的示例文本,第4次使用示例文本的正则表达式如下:To github.company.com:username/reponame.git
1a2b3C4..1a2b3C5 somebranchname -> maybeanotherbranchname但是上面的代码一直在打印它不匹配。我想我错过了shell如何解释正则表达式的东西,但我不知道它有什么奇怪之处。regex最后需要一个$吗?我尝试过一些关于^和两者组合的变体,但是还没有得到匹配的东西。谢谢!\n'
pushRegex='^([0-z]{7}[\.]{2}[0-z]{7}\s{2})(\w+)\s{1}(->)\s{1}(\w+)'
pr2='[(0-z)]{7}[(\.)]{2}[(0-z)]{7}\s{1}(\w+\s(->)\s\w+)我能够获得一些在C1和C2上工作的示例文本,第4次使用示例文本的正则表达式如下:A3但是上面的代码一直在打印它不匹配。我想我错过了shell如何解释正则表达式的东西,但我不知道它有什么奇怪之处。regex最后需要一个D4吗?我尝试过一些关于D5和两者组合的变体,但是还没有得到匹配的东西。谢谢!
pr3='^[(0-z)]{7}(\.){2}[(0-z)]{7}(\s+\w+\s+(->)\s\w+)'
pr4='^\w+\s(\w+)(.|\w+)(\w+)(.|\w+)(\w+:\w+[/](\w+.git))\n\s+([0-z]){7}[.]{2}([0-z]){7}\s+\w+\s(->)\s\w+'
echo "Copying current settings..."
cp ${HOMEPATH}/path/to/settings.txt ./ -f
echo "Checking the stage..."
gitAdd="$(git add ./)"
gitStatus="$(git status)"
echo "${NEWLINE}${NEWLINE}Does stage have changes?"
hasChanges="Changes to be committed:"
nothingToCommit="nothing to commit"
if [[ $gitStatus == *$hasChanges* ]]; then
echo "${NEWLINE}Changes detected${NEWLINE}Committing changes..."
stamp="$(date --date='TZ="America/New_York" today')"
git commit -m "Settings update: ${stamp}"
echo "${NEWLINE}Attempting push..."
pushAttempt="$(git push --dry-run 2>&1)"
echo "${NEWLINE}${NEWLINE}Output of dry run attempt:${NEWLINE}"
echo "${pushAttempt}"
if [[ $pushAttempt == *"->"* ]]; then
echo "we should push things"
else
echo "nothin to do"
fi
echo "${NEWLINE}Regex: ${pushRegex}"
if [[ $pushAttempt =~ $pushRegex ]]; then
echo "Matched regex!"
else
echo "Did not match :("
fi
echo "${NEWLINE}Regex: ${pr2}"
if [[ $pushAttempt =~ $pr2 ]]; then
echo "Matched regex!"
else
echo "Did not match :("
fi
echo "${NEWLINE}Regex: ${pr3}"
if [[ $pushAttempt =~ $pr3 ]]; then
echo "Matched regex!"
else
echo "Did not match :("
fi
echo "${NEWLINE}Regex: ${pr4}"
if [[ $pushAttempt =~ $pr4 ]]; then
echo "Matched regex!"
else
echo "Did not match :("
fi
fi我能够获得一些在C1和C2上工作的示例文本,第4次使用示例文本的正则表达式如下:
A3
但是上面的代码一直在打印它不匹配。
我想我错过了shell如何解释正则表达式的东西,但我不知道它有什么奇怪之处。
regex最后需要一个D4吗?我尝试过一些关于D5和两者组合的变体,但是还没有得到匹配的东西。
谢谢!
发布于 2020-03-21 10:59:14
由于您特别询问正则表达式以匹配尝试的git push命令的输出,因此这里是工作的起点。
#!/bin/bash
pushAttempt='To github.company.com:username/reponame.git
1a2b3C4..1a2b3C5 somebranchname -> maybeanotherbranchname'
printf "Output of dry run attempt:\n${pushAttempt}\n\n"
pr5=失败正则表达式中的一个要点是,从一开始就尝试将字符串与^匹配,但是正则表达式似乎只匹配pushAttempt的第二行。我忽略了第一行,除了换行符为零或更多次,然后是换行符。当然,其他方法也是可能的,这取决于您要匹配的字符串中包含了什么。另一点是您应该使用POSIX字符类,例如[[:space:]]而不是\s。关于regex的最后一个.*->.*$部分,您可以使其更严格地满足您的口味和需求,但是使用^启动正则表达式并以$结尾则需要字符串的完全匹配。奖金轨道您可以使用git status --untracked-files=no --porcelain来简化您的逻辑,以了解是否存在要提交的更改。通常,git提供了使命令输出更加“脚本友好”的选项,在解析输出之前值得查看文档;关于git status的这里。^[^\n]*\n[[:space:]]*[0-z]{7}[.]{2}[0-z]{7}.*->.*失败正则表达式中的一个要点是,从一开始就尝试将字符串与D2匹配,但是正则表达式似乎只匹配D3的第二行。我忽略了第一行,除了换行符为零或更多次,然后是换行符。当然,其他方法也是可能的,这取决于您要匹配的字符串中包含了什么。另一点是您应该使用C4,例如D5而不是D6。关于regex的最后一个D7部分,您可以使其更严格地满足您的口味和需求,但是使用D8启动正则表达式并以D9结尾则需要字符串的完全匹配。K110奖金轨道K211您可以使用D12来简化您的逻辑,以了解是否存在要提交的更改。通常,D13提供了使命令输出更加“脚本友好”的选项,在解析输出之前值得查看文档;关于D15的C14。
printf "Regex:\n${pr5}\n\n"
if [[ $pushAttempt =~ $pr5 ]]; then
echo "Matched regex!"
else
echo "Did not match :("
fi失败正则表达式中的一个要点是,从一开始就尝试将字符串与D2匹配,但是正则表达式似乎只匹配D3的第二行。我忽略了第一行,除了换行符为零或更多次,然后是换行符。当然,其他方法也是可能的,这取决于您要匹配的字符串中包含了什么。另一点是您应该使用C4,例如D5而不是D6。
关于regex的最后一个D7部分,您可以使其更严格地满足您的口味和需求,但是使用D8启动正则表达式并以D9结尾则需要字符串的完全匹配。
K110奖金轨道K211
您可以使用D12来简化您的逻辑,以了解是否存在要提交的更改。通常,D13提供了使命令输出更加“脚本友好”的选项,在解析输出之前值得查看文档;关于D15的C14。
https://unix.stackexchange.com/questions/573976
复制相似问题