Info
Content

SED

i.dudin@idudin-vb:~/Documents$ echo "test test niga mazafaka" | sed 's/test/azaza/'
azaza test niga mazafaka
i.dudin@idudin-vb:~/Documents$ echo "test test niga mazafaka" | sed 's/test/azaza/g'
azaza azaza niga mazafaka

Если применять команду к файлу (а не к stdin), то содержимое файла не изменяется (он просто берет текст из файла на обработку и результат выводит)

Чтобы выполнить несколько инструкций нужно использовать ключ -e

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
test
niga
niga
mazafaka
i.dudin@idudin-vb:~/Documents$ sed -e 's/test/niga/g; s/mazafaka/niga/g' test 
niga1
niga
niga
niga
niga
niga
niga

Ключ -f нужен для указания файла со скриптом

Кроме флага g у команды замены (s) есть и другие флаги, например можно указывать номер вхождения которое нужно заменить или записать вывод в файл (sed 's/test/new test/w filename' text)

Можно указывать диапазоны обрабатываемых строк

Во второй строке (если в ней есть вхождение) сделать замену

i.dudin@idudin-vb:~/Documents$ sed '3s/niga/1/' test 
test1
niga
mazafaka
test
niga
niga
mazafaka

Начиная с 5 и до конца сделать замену

i.dudin@idudin-vb:~/Documents$ sed '5,$s/niga/1/' test 
test1
niga
mazafaka
test
1
1
mazafaka

Первое значение не может быть больше второго при указании диапазона, также при указании диапазона не работает флаг g

Поиск подходящей строки по фильтру
Перед командой замены указывается фильтр
Пример: (если в строке встречается test1, то в этой строке заменить первое вхождение mazafaka на 000) (работает со всеми подходящими по фильтр строками)

i.dudin@idudin-vb:~/Documents$ cat newtest 
test1 niga test1 mazafaka test1
niga niga niga mazafaka niga
mazafaka niga mazafaka mazafaka mazafaka
test1 niga test mazafaka test
niga niga niga mazafaka niga
niga niga niga mazafaka niga
mazafaka niga mazafaka mazafaka mazafaka
i.dudin@idudin-vb:~/Documents$ sed '/test1/s/mazafaka/000/' newtest 
test1 niga test1 000 test1
niga niga niga mazafaka niga
mazafaka niga mazafaka mazafaka mazafaka
test1 niga test 000 test
niga niga niga mazafaka niga
niga niga niga mazafaka niga
mazafaka niga mazafaka mazafaka mazafaka
i.dudin@idudin-vb:~/Documents$ 

Чтобы удалить строку (строки) можно использовать команду d (нужно указывать номер удаляемой строки, если не указать то будут удалены все строки)

i.dudin@idudin-vb:~/Documents$ sed '1d' test
niga
mazafaka
test
niga
niga
mazafaka
i.dudin@idudin-vb:~/Documents$ sed '1,5d' test
niga
mazafaka

Можно удалять по фильтру

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
test
niga
niga
mazafaka
i.dudin@idudin-vb:~/Documents$ sed '/mazafaka/d' test
test1
niga
test
niga
niga

Можно указать диапазон строк по фильтру (указывается два фильтра через запятую и будут удалены все строки между этими фильтрами)

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
test22
niga
niga
mazafaka
test
test22
niga
mazafaka
aseohtu
aeou
aoeustnh

i.dudin@idudin-vb:~/Documents$ sed '/test22/,/test22/d' test
test1
niga
mazafaka
niga
mazafaka
aseohtu
aeou
aoeustnh

Ключ -i позволяет записать изменения в исходный файл (а не выводить на экран)

Чтобы вставить строку в поток можно использовать команду i или a
(по умолчанию она вставит текст после или до каждой входящей строки (см. пример))

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
niga
mazafaka
aseohtu
aeou
aoeustnh

i.dudin@idudin-vb:~/Documents$ sed -e 'i0000000' test
0000000
test1
0000000
niga
0000000
mazafaka
0000000
niga
0000000
mazafaka
0000000
aseohtu
0000000
aeou
0000000
aoeustnh
0000000

Вставить строку до указанной

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
i.dudin@idudin-vb:~/Documents$ sed -e '2i\00000' test
test1
00000
niga
mazafaka

Вставить строку перед строкой по фильтру

i.dudin@idudin-vb:~/Documents$ cat test
test1
niga
mazafaka
i.dudin@idudin-vb:~/Documents$ sed -e '/niga/i\00000' test
test1
00000
niga
mazafaka

Вставить в множество файлов (в начало или конец) определенную строку

i.dudin@idudin-vb:~/Documents$ ls
1   100  12  14  16  18  2   21  23  25  27  29  30  32  34  36  38  4   41  43  45  47  49  50  52  54  56  58  6   61  63  65  67  69  70  72  74  76  78  8   81  83  85  87  89  90  92  94  96  98
10  11   13  15  17  19  20  22  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   51  53  55  57  59  60  62  64  66  68  7   71  73  75  77  79  80  82  84  86  88  9   91  93  95  97  99
i.dudin@idudin-vb:~/Documents$ cat 1
testovaya stroka
1
$i
1
i.dudin@idudin-vb:~/Documents$ for var in `ls -1`; do sed -ie '$a'"$var nigerskaya stroka" $var; done
i.dudin@idudin-vb:~/Documents$ cat 1
testovaya stroka
1
$i
1
1 nigerskaya stroka
i.dudin@idudin-vb:~/Documents$ 

Заменить целую строку можно через команду c (так же как с командой d, если не указывать конкретные строки для обработки, заменит все входящие строки)

i.dudin@idudin-vb:~/Documents$ cat 11
testovaya stroka
11
$i
11
11 nigerskaya stroka
i.dudin@idudin-vb:~/Documents$ sed -e 'c\test test test' 11
test test test
test test test
test test test
test test test
test test test
i.dudin@idudin-vb:~/Documents$ 

Номер строки указывается перед командой

i.dudin@idudin-vb:~/Documents$ sed -ie '2c\test test test' 11
i.dudin@idudin-vb:~/Documents$ cat 11
testovaya stroka
test test test
$i
11
11 nigerskaya stroka

Можно воспользоваться фильтром для замены только в нужных строках

i.dudin@idudin-vb:~/Documents$ cat 11
testovaya stroka
test test test
$i
11
11 nigerskaya stroka
i.dudin@idudin-vb:~/Documents$ sed -ie '/11/c\test test test' 11
i.dudin@idudin-vb:~/Documents$ cat 11
testovaya stroka
test test test
$i
test test test
test test test
i.dudin@idudin-vb:~/Documents$ 

Замена символов

i.dudin@idudin-vb:~/Documents$ sed -ie 'y/e/1/' 11
i.dudin@idudin-vb:~/Documents$ cat 11
t1stovaya stroka
t1st t1st t1st
$i
t1st t1st t1st
t1st t1st t1st

Команда = показывает номер строки перед строкой

Ключ -n запрещает вывод потока (выводит только обработанные строки)

i.dudin@idudin-vb:~/Documents$ sed -ne '3p' 11
$i
No Comments
Back to top