sed: исключение строк серверных частей из сопоставленного шаблона

У меня была такая же проблема, и я решил ее, пытаясь решить это, поэтому я опубликую здесь свое решение (что довольно плохо).

Я использую wmctrl (вместо этого вы можете использовать xprop) и xdotool для этого. Раньше я использовал расширение, чтобы сделать URL-адрес видимым в строке заголовка (затем вы можете получить доступ к URL-адресу через xprop или wmctrl). Оба метода работают довольно хорошо, хотя и не совсем «чистые».

id=$(wmctrl -l | grep -oP "(?<=)(0x\w+)(?=.*Chromium)") //Put here the regex for the browser you use
xdotool key --window $id "ctrl+l"
xdotool key --window $id "ctrl+c"

Теперь у вас есть URL-адрес в буфере обмена. Затем я использую xclip для работы с URL-адресом.

Я хотел бы увидеть реальное решение этой проблемы, если кто-нибудь его найдет.

2
03.02.2017, 10:21
2 ответа

Вот как я бы это сделал:

sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'

Пример:

echo "nas_mba
nas_tvr
nas_foo" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_mba
nas_tvr
nas_bar

Только nas_foo в исходном тексте заменяется, а оба nas_mba и nas_tvr остаются нетронутыми.

Другой пример с большим количеством строк:

echo "nas_hat
> nas_mba
> nas_foo
> nas_hat
> nat_tvr
> nas_cat
> nas_dog" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

Если вы хотите изменить место, просто добавьте параметр -i (если вы используете GNU sed , вам не нужно -i "" достаточно просто -i ):

sed -E -i "" '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/' nas.txt 
cat nas.txt 
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

Протестировано в Mac OS X 10.11.6 и BSD sed .

2
27.01.2020, 21:59

Если perl является вариантом, вы можете использовать опережающий просмотр :

export SCL
perl -pe 's/nas_(?!mba|tvr)\w*/nas_$ENV{SCL}/g' file

(обратите внимание, что здесь предполагается, что последовательности, которые вы действительно хотите сопоставить, состоят из словесных символов - это может быть изменено, если это не так).

2
27.01.2020, 21:59

Теги

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