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