Любой ответ будет зависеть от того, что вы можете знать о вашем входе.
Если вы знаете, что вы хотите, чтобы второй BAR3
, окруженный ,
, вы могли бы сделать:
perl -pe 's#(.*bar3.*)(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
или
sed 's#\(.*bar3.*\)\(bar3\)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
или, с GNU SED
:
sed -r 's#(.*bar3.*)(bar3)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
Если вы хотите изменить все вхождения BAR3
, которые падают между A >
и <
(без <
Между ними) вы можете сделать:
perl -pe 's#(>[^<]*)(bar3)([^<]*<)#$1<font style=BACKGROUND-COLOR:red>$2</font>$3#' file
или
sed 's#\(>[^<]*\)\(bar3\)\([^<]*<\)#\1<font style=BACKGROUND-COLOR:red>\2</font>\3#' file
или, с GNU SED
sed -r 's#(>[^<]*)(bar3)([^<]*<)#\1<font style=BACKGROUND-COLOR:red>\2</font>\3#' file
, если вы хотите заменить любой BAR3
, который начинается на 33-й позиции строки, вы Можно сделать:
perl -pe 's#(.{32})(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
или
sed 's#\(.\{32\}\)\(bar3\)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
или, с GNU SED
sed -r 's#(.{32})(bar3)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
Есть другие варианты, конечно, но они всегда будут зависеть от именно то, что вы можете быть уверены о ваших входных данных.
я не знаю, ясно ли это, но вы можете прерывать петлю, когда вы используете разрыв и выход
set -A arrs a b c d
num=`expr ${#arrs[*]} - 1`
for x in `seq 0 $num`
do
var1=`some command here`
var2=`some command here`
var3=`some command here`
if [[ "$var1" == "$var2" && "$var3" == "0" ]]
then
#do something here
elif [[ "$var1" == "$var2" && "$var3" != "0" ]]
then
echo "\nContinue?"
echo "[y/n]:\c"
read yes_no
case $yes_no in
[yY])
echo "You answer yes."
echo "Some text that will go to the text file" >> some_text.txt
break
;;
[nN])
echo "you answered no"
exit
;;
*)
echo "\nTry again"
;;
esac
elif [[ "$var1" != "$var2" && "$var3" == "0" ]]
then
echo "\nContinue?"
echo "[y/n]:\c"
read no_yes
case $no_yes in
[yY])
echo "You answer yes"
echo "Some text that will go to the text file" >> some_text.txt
break
;;
[nN])
echo "you answered no"
exit
;;
*)
echo "\nTry again"
;;
esac
else
echo "Do back flip"
exit
fi
done
Вы добавили break
в инструкцию yes
, поэтому она выходит из for-loop
и поэтому не завершает тестирование остальной части массива. Просто удалите break
из заявления «да».
Я проверил с некоторыми модификациями к вашему кодексу и получил то, чему я верю, ваши ожидаемые результаты:
#!/bin/sh
arrs=(a b c d)
num=`expr ${#arrs[*]} - 1`
for x in `seq 0 $num`
do
var1=`echo "hi"`
var2=`echo "hi"`
var3=`echo "hi"`
echo "var1 equals: $var1"
echo "var2 equals: $var2"
echo "var3 equals: $var3"
if [[ "$var1" = "$var2" && "$var3" = 0 ]]
then
#do something here
echo "First check"
elif [[ "$var1" == "$var2" && "$var3" != 0 ]]
then
echo "\nContinue?"
echo "[y/n]:\c"
read yes_no
case $yes_no in
[yY])
echo "You answer yes."
echo "Some text that will go to the text file" >> some_text.txt
;;
[nN])
echo "you answered no"
exit
;;
*)
echo "\nTry again"
;;
esac
elif [[ "$var1" != "$var2" && "$var3" == 0 ]]
then
echo "\nContinue?"
echo "[y/n]:\c"
read no_yes
case $no_yes in
[yY])
echo "You answer yes"
echo "Some text that will go to the text file" >> some_text.txt
;;
[nN])
echo "you answered no"
exit
;;
*)
echo "\nTry again"
;;
esac
else
echo "Do back flip"
exit
fi
done
[root]# sh test.sh
var1 equals: hi
var2 equals: hi
var3 equals: hi
\nContinue?
[y/n]:\c
y
You answer yes.
var1 equals: hi
var2 equals: hi
var3 equals: hi
\nContinue?
[y/n]:\c
y
You answer yes.
var1 equals: hi
var2 equals: hi
var3 equals: hi
\nContinue?
[y/n]:\c
y
You answer yes.
var1 equals: hi
var2 equals: hi
var3 equals: hi
\nContinue?
[y/n]:\c
y
You answer yes.
[root]# sh test.sh
var1 equals: hi
var2 equals: hi
var3 equals: hi
\nContinue?
[y/n]:\c
n
you answered no