Как мы все знаем, sed
является очень эффективным , чтобы найти и заменить строку, например , находка «а» и заменить его на «Ъ»: sed 's/a/b/g'
.
Возможно ли сделать это с помощью другой команды или сценария оболочки вместо sed
?
Это для обрезанных систем Linux для телевидения, которые не имеют sed
команды. Поэтому я должен использовать другие команды или сценарии вместоsed 's/a/b/g'. –
shell
text-processing
binghenzq
источник
источник
$var=~s/a/b/g
,gsub(/a/,"b",var)
,var.gsub(/a/,'b')
,var.replace(/a/g,'b')
,preg_replace("/a/","b",$var)
,regsub -all a b $var
. Кроме того, многие инструменты и языки могут также выполнять замену строк в виде простого текста. Так что ваш вопрос как-то широк.Ответы:
Да, есть множество способов сделать это. Вы можете использовать
awk
,perl
илиbash
сделать эти мероприятия , а также. Хотя в целомsed
это, пожалуй, самый подходящий инструмент для выполнения таких задач.Примеры
Скажем, у меня есть этот пример данных в файле
data.txt
:AWK
Perl
Встроенное редактирование
Приведенные выше примеры также могут напрямую изменять файлы. Пример Perl тривиален. Просто добавьте
-i
переключатель.Поскольку
awk
это немного менее прямое, но столь же эффективное:Этот метод создает вложенную оболочку с фигурными скобками '{...} `, куда файл перенаправляется в него через это:
Как только файл был перенаправлен в вложенную оболочку, он удаляется и затем
awk
запускается для содержимого файла, который был прочитан в вложенные оболочки STDIN. Затем этот контент обрабатываетсяawk
и записывается обратно в то же имя файла, которое мы только что удалили, эффективно заменяя его.источник
sed
не I. Сед является подходящим инструментом для таких замен, и он, очевидно, просит лучше понять роль этих инструментов, поэтому показывать кому-то эти вещи, хотя они и плохие, чрезвычайно полезны для показа их почему. Слишком много раз люди, находящиеся в курсе, просто говорят «не делай этого», не объясняя, почему, и я тоже. Но спасибо, по крайней мере, оставить комментарий о том, почему вы DV.Классическая альтернатива для замены одной буквы - это
tr
команда, которая должна быть доступна практически на любой системе:tr
лучше, чемsed
для этого на самом деле, так как с помощьюsed
(не говоря уже оperl
илиawk
) для замены одной буквы похоже на использование кувалды для убийства мухи.grep
не предназначен для этого, он не изменяет свой ввод, он только просматривает его.Кроме того, вы можете использовать возможности замены некоторых оболочек. Здесь , используя
ksh
,zsh
илиbash
синтаксис:Мы могли бы дать вам более конкретные ответы, если бы вы точно объяснили, какую проблему вы пытаетесь решить.
источник
${foo//a/b}
?echo "$foo" | sed 's/a/b/i
или дать класс символов:echo ${foo//[aA]/b}
.Вы можете использовать Vim в режиме Ex:
%
выбрать все строкиs
заменаg
глобальная заменаx
сохранить и закрытьисточник
Если вы работаете с файлом, а не с потоком, вы можете использовать стандартный текстовый редактор
ed
:Это должно быть доступно на любом * nix. Запятая
',s/a/b/g'
указывает, чтоed
нужно работать с каждой строкой (вы также можете использовать ее%
, что будет более знакомо, если вы привыкли к vim), а остальная часть - стандартный поиск и замена.w
говорит ему написать (сохранить) файл,q
говорит ему выйти.Обратите внимание, что в отличие от Сед
-i
(и аналогичных параметров в других инструментах), он на самом деле редактирует файл на месте, а не изменяет временные файлы.Я не думаю, что это возможно, чтобы это работало с потоками, но тогда я не очень разбираюсь в этом,
ed
и я не удивлюсь, если он действительно имеет такую возможность (философия Unix такова, какова она есть).источник
Используя команду ancestor ed (что
-s
означает «тихий» («тихий») и запятую перед командами означает «выполнить во всех строках»):Просто печать на STDOUT :
замена на месте:
источник