Как избежать избыточных заменителей в SED?

keytool не регистрирует информацию; он записывает только стандартный вывод и стандартную ошибку. В его документации перечислено несколько случаев, когда он будет использовать один или другой, и не упоминается ведение журнала.

0
19.09.2018, 10:03
4 ответа

Вы можете включить Binв текст для замены, если это приведет к замене самого себя:

sed 's/\(Bin\)\{0,1\}\.txt/Bin.txt/g'

Или если ваш sedподдерживает ERE с-E(или -rдля некоторых более старых версий GNU или busyboxsed):

sed -E 's/(Bin)?\.txt/Bin.txt/g'

Осторожно .— это оператор регулярного выражения, который соответствует любому одиночному символу. Вам нужно, чтобы \.соответствовало буквальной точке .

3
28.01.2020, 02:14

Вы можете выполнить условную замену с sed, например, вы можете проверить, содержит ли строка уже Bin.txtи выполнить замену, только если это не так.

sed '/Bin\.txt/!s/\.txt/Bin.txt/'

Это предполагает, что потребуется только одна замена на строку.

Вы также можете сделать замену безоговорочно, а затем исправить ее, если она пошла не так, как вы намекнули в вопросе, но в том же вызовеsed:

sed -e 's/\.txt/Bin.txt/' -e 's/BinBin/Bin/'
1
28.01.2020, 02:14

Вы можете использовать perl-обратный просмотр для соответствия .txt, но только в том случае, если это не Bin.txt.

perl -pe 's/(?<!Bin)\.txt/Bin.txt/g'

Следовательно, для проверки:

$ echo 'Bin.txt foo.txt' | perl -pe 's/(?<!Bin)\.txt/Bin.txt/g'
Bin.txt fooBin.txt

К сожалению, sedне предлагает такой конструкции.

2
28.01.2020, 02:14

Вы можете сделать это с помощью GNU-sed, как показано:

echo "$Filnam" |\
sed -e '
   s/\.txt/\n&/;T   # try to place a newline marker to the left of.txt, quit if unsuccessful
   s/Bin\n/Bin/;t   # If the marker turned out to be just to the right of Bin => Bin.txt already 
                    # existed in the name, so we needn"t do anything n take away the marker n quit
   s/\n/Bin/        # Bin could not be found adjacent to.txt so put it n take away the marker as well
'

### Below is the POSIX sed code for accomplishing the same:
sed -e '
    s/\.txt/\
&/;/\n/!b
    s/Bin\n/Bin/;/\n/!b
    s/\n/Bin/
'
0
28.01.2020, 02:14

Теги

Похожие вопросы