Ви не вказали , які саме ваші вимоги. Можливо, ви хочете багатоетапний процес. Виберіть рядок, який, на вашу думку, не відбудеться у вашому введенні (наприклад, ####
):
відлуння "Швидка бура лиса стрибає над 42 ледачими собаками у 2012 та 2013 роках". \
| sed \
-e "s / [0-9] \ {4 \} / & #### /" \
-e "s / fox. * #### //" \
-e "s / #### //"
(Команда надмірно складена для читабельності.) -e "s/[0-9]\{4\}/&####/"
Вводиться ####
після першого чотиризначного числа. (Попередження: це зміниться 65536
на 6553####6
.)
-e "s/fox.*####//"
Впливає на рядки, які містять fox
і ####
- тобто рядки, що містять щонайменше одне чотирицифрове число -, а потім видаляється fox
через перше чотиризначне число.
-e "s/####//"
Звичайно, очищає всі ####
рядки, що залишилися від рядків, що містять чотиризначне число, але не fox
.
Щоб також видалити один пробіл після номера, якщо такий є,
відлуння "Швидка бура лиса стрибає над 42 ледачими собаками у 2012 та 2013 роках". \
| sed \
-e "s / [0-9] \ {4 \} / & #### /" \
-e "s / fox. * #### //" \
-e "s / fox. * #### //" \
-e "s / #### //"
Попередження: Ви можете додати g
до всіх s
команд, але, оскільки це все ще використовується .*
, що є коренем вашої проблеми, воно все одно не буде працювати
One fox jumps in 2012 and 2013, another fox will jump in 2014 and 2015.
так, як ви, мабуть, хочете. І, звичайно, ви НЕ хочете , щоб додати g
до , "s/[0-9]\{4\}/&####/"
тому що тоді він буде вводити ####
після кожних з чотирьох цифр, розбивши весь сенс. Тоді в "s/fox.*####//"
кінцевому підсумку буде діяти так само "s/fox.*[0-9]\{4\}//"
(ваша оригінальна команда з видаленими символами, що не вносяться); тобто воно зміниться
Швидка бура лиса стрибає у 2012 та 2013 роках.
до
Швидка бура лиса стрибає в 2012 #### та 2013 ####.
а потім до
Швидкий коричневий.