Пожалуйста, имейте в виду, что
(?:...)
— это незахватывающая группа и регулярное выражение POSIX не поддерживает эту конструкцию(?!...)
является отрицательным опережением, и регулярное выражение POSIX также не поддерживает эту конструкцию.Чтобы замаскировать все содержимое между последней парой двойных кавычек, вы можете использовать
sed -r 's/(.*)".*"/\1"XXXX"/' file
sed 's/\(.*\)".*"/\1"XXXX"/' file
Смотрите демонстрацию sed:
s='"192.xx2" "someting" "another2321SD"'
sed -r 's/(.*)".*"/\1"XXXX"/' <<< "$s"
# => "192.xx2" "someting" "XXXX"
@WalterA Спасибо, Уолтер. Предполагая, что последняя цитируемая часть действительно близка к концу строки, я думаю, что текущий подход уже должен быть достаточно хорошим. awk
не рассматривал из-за вопросительных тегов, думаю тогда может быть еще много предположений.
Вспомните, что было перед последней парой двойных кавычек в захвате.
sed -r 's/^(.*)"[^"]*"$/\1"XXXX"/'
На stackoverflow.com/a/66778854/3220113 вы просите об улучшении. Я не знаю, лучше ли мои ответы, но вы также можете предположить, что
"
— это последний символ ввода:sed 's/"[^"]*"$/"XXXX"/' <<< "$s"
. Если вы не уверены (или когда с вас взимается плата за каждую двойную кавычку), вы можете использоватьrev < <(sed -r 's/[^"]+/XXXX/' <( rev <<<"$s"))
. Хуже, кажется,awk -F '"' 'BEGIN { OFS = "\""} { $(NF-1) = "XXXX"; print }' <<< "$s"
.