Просто попытка Не лучший подход
for ((i=1;i<=3;i++)); do awk -v i="$i" 'NR==i{gsub("&","\n",$0);print $0}' o.txt| sed "s/=.*/=FUZZ/g"| sed "N;s/\n/\&/g"|sed "N;s/\n/\&/g"; done
выход
http://example.com/mall/mall/detail3.jsp?proID=FUZZ
http://example.com/mall/member/member/bookshelves/add.jsp?proID=FUZZ&productName=FUZZ
http://example.com/mall/bestbookTW//mall/detail3.jsp?proID=FUZZ&c=FUZZ&id=FUZZ
В вашем регулярном выражении используется синтаксис PCRE, подобный \d
, ноgrep -E
(это то же, что и ваше egrep
, но вместо этого используйте grep -E
, egrep
устарело )не понимает этого. Кроме того, вам не нужны круглые скобки, вы на самом деле ничего не фиксируете. Если у вас GNU grep
, вы можете использовать grep -P
вместо:
grep -Pqv 'Android-\d{3,4}.{20,}'
Если нет, вам придется заменить \d
на[0-9]
:
grep -Eqv 'Android-[0-9]{3,4}.{20,}'
Тем не менее, вам не нужно (или хотите, чтобы )брал только первую строку файла, вы можете просто выполнить grep для всего файла напрямую. Вам также не нужно переворачивать совпадение (-v
), что только усложняет ситуацию. Вот более простая рабочая версия вашего скрипта, использующая if !
для отмены условия:
#!/bin/sh
if ! grep -E 'Android-[0-9]{3,4}.{20,}' "$1"; then
printf "[Message Format] Your message is not formatted correctly. Correct message format:
#Ticket Number - Minimum 20 or more Character
like #Android-123 Bug fixed for login issue\n"
exit 1;
fi
Вот, я бы сделал:
#! /bin/sh -
file="${1?No file specified}"
die() {
printf >&2 '%s\n' "$@"
exit 1
}
awk '
BEGIN {ret = !ok}
/^#Android-[[:digit:]]{3,4}[^[:digit:]].{19}/ {ret = ok}
{exit}
END {exit ret}' < "$file" || die \
'[Message Format] Your message is not formatted correctly. Correct message format:' \
'#Ticket Number - Minimum 20 or more Character' \
'like #Android-123 Bug fixed for login issue'
(удалите ^
, если вам не требуется, чтобы номер билета находился в начале строки ).