Я не эксперт, но я никогда не видел локаль, которая определяет сопоставление как это. AFAIK, которым это сопоставление находится только в C, где это основано на значениях ASCII. (Обычно я просто решил бы это сценарием.)
Однако я никогда не делал этого, но Вы могли бы хотеть посмотреть на localedef (1) и локаль (5) страницы справочника для получения понимания того, как локали определяются и в конечном счете определяют собственную.
Также не забывайте, что, если существуют какие-либо диакритические знаки или специальные символы, C локаль, не будет рассматривать их, как Вы могли бы хотеть. Например, это не поместит á
рядом a
или Ł
рядом L
. В таких случаях собственная локаль языка была бы, вероятно, лучшей начальной точкой.
Решение perl
:
$ perl -ple 's/\\\.1\\\.(7|8|9)/\\.1\\.10/' file | uniq
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
Если вы хотите отредактировать код, вы можете попробовать:
perl -i.bak -nle 'next if $count and /!\^/;s/\\\.1\\\.(7|8|9)/\\.1\\.10/ and $count++ if /!\^/;print' file
Мне удалось это сделать, удалив все строки и вставив их заново, но мне нужно оптимальное решение (потому что здесь удаление всей строки, а затем добавление новой целой строки) и я хочу добавить пробелы в добавленные строки:
delete:
sed -i '/!^.*$/d' test2
remove back:
sed -i '/RewiteEngine On/aRewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]' test2
вывод:
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192.168.1.10$ [NC] # need whites spaces at the begining
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
sed '/!/d;/\(\^[^5]*\)./{h;s//!\110/p;g;}' <<\DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.7$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.8$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.9$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
Таким образом, это зависит от s/ubsti/tution/
, совпадающего с последним адресом - что он и сделает. Когда /адрес/
пуст, как s//
или //
, подразумевается предыдущий адрес. Он удаляет все строки /!/
, содержащие взрыв, затем обращается к строке с ^
и помещает ее в пробел. Затем он редактирует его, p
прорисовывает его, и снова перезаписывает своим исходным значением еще в h
старом пространстве.
Но если адрес совпадал с h
старой строкой и отредактированными строками, то их можно было бы просто продолжать редактировать. Может быть так:
sed '/!/d;/\(\^[^$]*\.\)[0-9]*/{h;s//!\110/p;s//\111/p;s//\112/p;g;}' <<\DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.7$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.8$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.9$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.11$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.12$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
OUTPUT, хотя, если честно, то больше, и вы, наверное, захотели бы подойти к этому немного по-другому. Maybe with printf
?
ips() { printf 's//\\1%d/p;' $(seq "$@") ; echo 'g;}' ; }
sed '/!/d;/\(\^[^$]*\.\)[0-9]*/{h;s//!\110/p;'"$(ips 11 30)" <<\DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.7$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.8$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.9$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>
DATA
RewiteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.10$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.11$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.12$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.13$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.14$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.15$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.16$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.17$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.18$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.19$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.20$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.21$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.22$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.23$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.24$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.25$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.26$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.27$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.28$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.29$ [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.30$ [NC]
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.5$ [NC]
</Directory>