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