поиск и замена специальным символом sed

regex2=$'\x28'точно эквивалентен regex2='(', оболочка обрабатывает кавычки $'...', когда происходит присваивание. И (сам по себе является недопустимым регулярным выражением, поэтому [[ =~ ]]сообщает об ошибке, возвращая статус выхода2:

$ re='('; [[ "(" =~ $re ]]; echo "$?"
2

(Конечно, внутри инструкции ifвы не можете отличить код выхода 1для "нет совпадения" и 2для "ошибки", но она есть.)

Вам нужно избежать открывающей скобки из регулярного выражения:

$ re='\('; [[ "(" =~ $re ]] && echo match
match

или поместите его в группу квадратных скобок:

$ re='[(]'; [[ "(" =~ $re ]] && echo match
match

При быстром тестировании регулярные выражения Bash не поддерживают экранирование шестнадцатеричных или восьмеричных символов, поэтому re='\050'или re='\x28'не работают.

0
08.03.2021, 10:11
2 ответа

Использование sedдля редактирования файлов XML почти никогда не является хорошей идеей. Если файл XML имеет немного другой формат, ваш метод не работает.

Если бы у вас был правильный XML (, а я думаю, он вам все равно понадобится ), вы могли бы использовать XML-инструменты, например. xmlstarlet.

Правильный xmlозначает, что у вас есть как минимум:

  • Где-то объявлено пространство имен android
  • Тег TextViewзакрывается (, например. с/>)
  • Атрибуты существуют только один раз для каждого тега (в вашем примере, android:textColorопределены дважды, что делает XML недействительным ).

Поскольку вы не приводите полный пример своего XML-документа, я сделал его минимально допустимым, как здесь:

<TextView               xmlns:android="http://schemas.android.com/apk/res/android"
                        android:textSize="20.0sp"
                        android:textStyle="bold"
                        android:textColor="@android:color/white"
                        android:layout_gravity="center"
/>

Теперь вы можете использоватьxmlstarlet:

xmlstarlet ed -P -S \
  -N android="http://schemas.android.com/apk/res/android" \
  -u "//TextView/@android:textColor" \
  -v "#ffff5d" \
file.xml 

Выход:

<?xml version="1.0"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:textSize="20.0sp"
    android:textStyle="bold"
    android:textColor="#ffff5d"
    android:layout_gravity="center"
/>
0
18.03.2021, 22:27

спасибо за ограниченное использование sed 's|android :textColor="@android :color/white"|android :textColor=" #ffff5d"|g' работает нормально, я просто редактирую некоторые apk на телефоне, поэтому я даже не знаю, существует ли двоичный файл xmlstarlet для ARM 64 android.

0
18.03.2021, 22:27

Теги

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