Вы не указали точно, каковы ваши требования. Вы можете хотеть многошаговый процесс. Выберите строку, которая, как вы знаете, не будет присутствовать при вводе (например, ####
):
echo "The quick brown fox jumps over 42 lazy dogs in 2012 and 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
.
Чтобы также удалить один пробел после числа, если есть,
echo "The quick brown fox jumps over 42 lazy dogs in 2012 and 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 ####.
а затем
Быстрый коричневый.