SED в примерах

tr regexp sed

Типичный пример использования:

sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Замещающая правка

GNU sed имеет несколько новых особенностей, например замещающая правка файлов (замена первоначального файла результатом работы sed). Замещающая правка часто используется вместо сценария sed, например:

sed -i 's/abc/def/' file

Работа по файлу

Несколько команд могут быть объединены в одном файле (например, subst.sed) и затем применены в виде:

sed -f subst.sed inputFileName > outputFileName

Удаление пустых строк

Помимо замены, возможны и другие формы простой обработки. Например, следующий сценарий удаляет пустые строки или строки, которые содержат только пробелы:

sed -e '^s*$/d' inputFileName

Пакетная замена по итогам поиска

Замена всех упоминаний сайта dev-house.ru на ritcenter.com во всех файлах config.xml из каталога /home/user/.hudson:

sed -i 's/dev-house.ru/ritcenter.com/g' `find /home/user/.hudson -name config.xml`

Удаление граничных пробелов и комментариев в sed

Удаление комментариев и пустых строк

sed ' *#/d; /^ *$/d'

Объединение строк, разделенных символом

sed ':a; /$/N; s/n//; ta'

Удаление граничных пробелов и табуляций

sed 's/[ t]*$//'

Удаление пустых строк

sed -e '/^$/d'

Преобразовать DOS файл в UNIX

Для решения необходимо убрать ^M в конце строк.
Можно использовать tr для преобразования из DOS в Unix, однако это правильно отработает, если CR появляется в вашем файле только как первый байт пары байтов CRLF. Как правило, это так, но не всегда. Затем необходимо дать команду:

tr -d '015' < DOS-file > UNIX-file

Если вы знаете, как ввести возврат каретки в script (control-V, control-M, чтобы ввести control-M), тогда:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

Еще один рабочий вариант:

sed 's/\r$//' DOS-file

Еще примеры:

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'              # assumes that all lines end with CR/LF
sed 's/^M$//'             # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/x0D$//'            # works on ssed, gsed 3.02.80 or higher

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e r`/"    # command line under ksh
sed 's/$'"/`echo r`/"     # command line under bash
sed "s/$/`echo r`/"       # command line under zsh
sed 's/$/r/'              # gsed 3.02.80 or higher

Вывести текст вертикально

echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '012'

Замещение текста на значение переменной

uname="OLeg Petrov"
sed -e 's/user/'${uname}'/g' omega.ovpn > config/omega-$uname.ovpn

Замещение исходной строки, содержащей переменную ($POOLS) на текст

sed -i 's%evsd -n $POOLS%evsd -g /var/lib/sheepdog%g' /var/lib/lxc/CNDR-0003/rootfs/etc/systemd/system/evstorage.service

здесь используем в качестве разделителя выражений “%”, вместо “/”

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

Например, 21-ую строку (имя ВМ) 

os server show -f value 69430ca1-0bd3-4eec-8813-ffd6b9f65058 | sed '21q;d'

Удалить одну последнюю строку из файла

sed -i ''$(wc -l /path/some_file | awk '{print $1}')'d' /path/some_file

Удалить строку по номеру из файла

Например строку номер 17:

sed -i '17d' /path/some_file

Замена содержимого строки по ее номеру

sed -i 'Ns/.*/replacement-line/' file.txt

N - номер строки, где производится замена
‘.*’ - замена всего содержимого строки
replacement-line - текст, который будет в строке с номером N

Хороший пример в программе arsenal/websites/ssl/ssl-wildcard-mass-upd.sh

Удалить последние N строк из файла:

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2

tac

Еще один хитрый вариант (cat наоборот):

n=4
tac file.txt | sed "1,$n{d}" | tac

Замена части строки по шаблону (замена sed

Пример 1:

MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*}  # оставляет часть строки перед двоеточием (/var/cpanel/users/joebloggs)
NAME=${NAME##*/}  # оставляет часть строки после последнего слеша (joebloggs)
${MYVAR#pattern}     # delete shortest match of pattern from the beginning
${MYVAR##pattern}    # delete longest match of pattern from the beginning
${MYVAR%pattern}     # delete shortest match of pattern from the end
${MYVAR%%pattern}    # delete longest match of pattern from the end

Пример 2:

Обрезка строковой переменной по номерам символов

${MYVAR:3}   # удаляет из строки первые три символа 
${MYVAR::3}  #  удаляет все символы после третьего 
${MYVAR:3:5} #  оставляет символы с четвертого по девятый (вырезает первые три и все из остатка после пятого)

Пример 3:

${MYVAR/search/replace}

28.07.2020