Linux sed удалить часть строки
В этом приложении содержится очень краткое описание приемов работы с утилитами обработки текста sed и awk. Здесь будут рассмотрены лишь несколько базовых команд, которых, в принципе, будет достаточно, чтобы научиться понимать простейшие конструкции sed и awk внутри сценариев на языке командной оболочки. sed: неинтерактивный редактор текстовых файлов awk: язык обработки шаблонов с C-подобным синтаксисом При всех своих различиях, эти две утилиты обладают похожим синтаксисом, они обе умеют работать с регулярными выражениями, обе, по-умолчанию, читают данные с устройства stdin и обе выводят результат обработки на устройство stdout. Обе являются утилитами UNIX-систем, и прекрасно могут взаимодействовать между собой. Вывод от одной может быть перенаправлен, по конвейеру, на вход другой. Их комбинирование придает сценариям, на языке командной оболочки, мощь и гибкость языка Perl.
Таблица B-1. Основные операции sed
Операция | Название | Описание |
---|---|---|
[диапазон строк]/p | Печать [указанного диапазона строк] | |
[диапазон строк]/d | delete | Удалить [указанный диапазон строк] |
s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2 |
[диапазон строк]/s/pattern1/pattern2/ | substitute | Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк |
[диапазон строк]/y/pattern1/pattern2/ | transform | заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr) |
g | global | Операция выполняется над всеми найденными соответствиями внутри каждой из заданных строк |
Без оператора g ( global ), операция замены будет производиться только для первого найденного совпадения, с заданным шаблоном, в каждой строке. |
sed -e '/^$/d' $filename # Ключ -e говорит о том, что далее следует строка, которая должна интерпретироваться #+ как набор инструкций редактирования. # (При передаче одной инструкции, ключ "-e" является необязательным.) # "Строгие" кавычки ('') предотвращают интерпретацию символов регулярного выражения, #+ как специальных символов, командным интерпретатором. # # Действия производятся над строками, содержащимися в файле $filename.
В отдельных случаях, команды редактирования не работают в одиночных кавычках.
filename=file1.txt pattern=BEGIN sed "/^$pattern/d" "$filename" # Результат вполне предсказуем. # sed '/^$pattern/d' "$filename" дает иной результат. # В данном случае, в "строгих" кавычках (' . '), #+ не происходит подстановки значения переменной "$pattern".
Sed использует ключ -e для того, чтобы определить, что следующая строка является инструкцией, или набором инструкций, редактирования. Если инструкция является единственной, то использование этого ключа не является обязательным. |
sed -n '/xzy/p' $filename # Ключ -n заставляет sed вывести только те строки, которые совпадают с указанным шаблоном. # В противном случае (без ключа -n), будут выведены все строки. # Здесь, ключ -e не является обязательным, поскольку здесь стоит единственная команда.
Таблица B-2. Примеры операций в sed
Операция | Описание |
---|---|
8d | Удалить 8-ю строку. |
/^$/d | Удалить все пустые строки. |
1,/^$/d | Удалить все строки до первой пустой строки, включительно. |
/Jones/p | Вывести строки, содержащие «Jones» (с ключом -n ). |
s/Windows/Linux/ | В каждой строке, заменить первое встретившееся слово «Windows» на слово «Linux» . |
s/BSOD/stability/g | В каждой строке, заменить все встретившиеся слова «BSOD» на «stability» . |
s/ *$// | Удалить все пробелы в конце каждой строки. |
s/00*/0/g | Заменить все последовательности ведущих нулей одним символом «0». |
/GUI/d | Удалить все строки, содержащие «GUI» . |
s/GUI//g | Удалить все найденные «GUI» , оставляя остальную часть строки без изменений. |
Замена строки пустой строкой, эквивалентна удалению части строки, совпадающей с шаблоном. Остальная часть строки остается без изменений. Например, s/GUI//, изменит следующую строку
The most important parts of any application are its GUI and sound effects
The most important parts of any application are its and sound effects
Символ обратного слэша представляет символ перевода строки, как символ замены. В этом случае, замещающее выражение продолжается на следующей строке.
Эта инструкция заменит начальные пробелы в строке на символ перевода строки. Ожидаемый результат — замена отступов в начале параграфа пустыми строками.
Указание диапазона строк, предшествующее одной, или более, инструкции может потребовать заключения инструкций в фигурные скобки, с соответствующими символами перевода строки.
В этом случае будут удалены только первые из нескольких, идущих подряд, пустых строк. Это может использоваться для установки однострочных интервалов в файле, оставляя, при этом, пустые строки между параграфами.
Быстрый способ установки двойных межстрочных интервалов в текстовых файлах — sed G filename. |
- Пример 33-1
- Пример 33-2
- Пример 12-2
- Пример A-3
- Пример 12-12
- Пример 12-20
- Пример A-13
- Пример A-19
- Пример 12-24
- Пример 10-9
- Пример 12-33
- Пример A-2
- Пример 12-10
- Пример 12-8
- Пример A-11
- Пример 17-11
Примечания
Если адресное пространство не указано, то, по-умолчанию, к обработке принимаются все строки.
sed в linux — примеры использования
Утилита sed это мощный потоковый редактор текста с поддержкой регулярных выражений. С помощью sed вы можете заменять шаблоны текста (причем непосредственно в файле!), удалять строки (элементы массива), выводить подходящие по маске строки (подобно grep). Редактор sed поддерживает применение нескольких команд и расширенный синтаксис регулярных выражений (при котором не нужно экранировать спец. символы).
Важно!
В sed нет поддержки опережающих и ретроспективных проверок в регулярках! Для замены с использованием расширенного синтаксиса regex используйте:
find . -type f -name '*.blade.php' -exec perl -p -i -e 's/(? \;
Внимание!
В sed довольно проблемно работать с символом перевода строки! Самое удобное решение — это:
sed [-opt] 's/regex/replace/flag' input-file sed 's/regex/replace/flag' # замена найденных подстрок sed '1,5s/regex/replace/gi' # замена только в указанном диапазоне строк sed -r 's/regex/replace/g' # расширенный синтаксис regex (со спец символами) sed 's/regex//g' # удалить найденные подстроки sed '/regex/d' # удалить строки подходящие по маске sed -n 2p # вывести 2ю строку sed -n '/composer/p' # вывести только строки подходящие по маске sed 's/1-9/&/p' # & при замене означает сам ОБРАЗЕЦ
В качестве разделителей можно использовать любые символы (напрмиер: # , @ ). Match части (которые внутри круглых скобок) доступны как \1 , \2 , \n .
-p вывести на экран -d удалить -i выполнять изменения непосредственно в файле -n не выводить результат замены/поиска на экран (--quiet, --silent) -e указывает на передачу инструкции (команда замены/удаления или выражение для поиска/фильтрации). Нужен, если Вы передаете более 1 инструкции -E расширенный regex, ближе к JavaScript, Go. Активны спец символы: 7+ -r расширенный regex синтаксис. Спец символы активны по умолчанию (--regexp-extended) -P perl-совместимый regex синтаксис -s consider files as separate rather than as a single continuous long stream (--separate)
Флаги строки-команды (указывать в конце маски):
g глобальный поиск/замена, а не только первое совпадение i,-l регистро-независимый поиск p, печать найденных подстрок d удалить строки
Примеры
Фильтрация строк
Вывести файлы соответствующие маске:
Строки длиннее 80 символов:
sed -n '/^./p' sed -n '/^./!p' # короче 80 символов
Замена по шаблону
Заменить строки начинающиеся с:
sed 's/^line_start=.*$/line_start="replacement"/' file
Вывести вхождения (matches) через табуляцию:
Заменить названия файлов (composer на composer-dev):
echo 'aa,bb,xx' | sed "s/xx/cc/g" # aa,bb,cc
Заменить URL в файле (штука в разделителях | , и -i для замены в файле):
sed -i "s|$old_site_url|$new_site_url|g" file.yml
Заменить параметр в конфиге:
sed -ie '/project_file_path *=/ s|=.*$|=/home/pi/apps|' ~/.config/geany/geany.conf
Заменить значение в xml-конфиге:
sed -i -r 's/(name="width" value=")[^"]+"/\148KP"/' /etc/ImageMagick-6/policy.xml
Удалить начальные пробелы (аналог ltrim):
echo " some string" | sed 's/^ *//g'
echo " test " | xargs echo " test " | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
Удалить часть приглашения командной строки:
Удаление строк
Удалить из файла строку подходящую шаблону:
Удалить первую строку вывода:
sed 1d # удалить первую строку sed '5, 10d' # удалить строки c 5-й по 10-ю
Удалить строки от первой до соответствующей regex:
echo '--some string' | sed 's/\(Some\)/New \1/i' # --New some string
Примечание
По умолчанию необходимо экранировать все спец. символы в regex’ах, что крайне затрудняет чтение масок. Для того, чтобы экранировать спец.символы только в случае описания в тексте их самих — включите расширенный режим regex выражений с помощью опции -r .
Удалить последние N=2 символа:
Извлечение подстрок
Вырезать / запомнить последние N=4 символа:
echo "latest" | sed "s/.*\(. $\)/\1/" # test
How to delete a substring using shell script
-F. means split the string by . and $1 means the first column.
If these strings are stored in a file (let’s call it input_file ):
# input_file: abc.out abc.out abc.out def.out def.out def.out
And this will remove any occurrence of the substring .out from that file.
Explanation:
- sed : invoke the sed tool to edit streams of text
- -i : use the «in-place» option — this modifies the input file you provide it instead of writing output to stdout
- ‘s/\.out//g’ : Use regular expression to delete .out . the g at the end means delete all occurrences.
- input_file : specify the input file
If these strings are stored in variables:
Explanation:
- From the above link: «$ Remove from $var the shortest part of $Pattern that matches the back end of $var.»
- Note that the «pattern» mentioned here is called globbing, which is different from regular expression in important ways.
@WilliamPursell I guess that depends on exact input of his files: you are right, I should make my assumptions more clear.
I found this worked best because the pattern you want to use can be in a variable:
DATA="abc.out" pattern=".out" DATA=$ echo "DATA=$"
$ foo=abc.def.out $ echo $ abc.def
In general, to delete the shortest suffix, use:
To delete the longest suffix, use
@not2savvy The OP used the word «substring», but is clearly asking only to delete suffixes. Shall we take all questions literally? I estimate that at least 85% of all questions asked are stated incorrectly. If answered literally, the answers would all be useless.
I think he’s not „clearly asking only to delete suffixes“, bzt he just gave that as one example of what he’s asking for. Perhaps I’m wrong. However, an answer that gives a more general approach is obviously useful for more people. Just saying!
sed удалить часть строки
подскажите пожалуйста как в текстовом документе при помощи sed найти строку начинающуюся с link= и удалить после равно все в этой строке до слова test.
$ echo link= foo test bar test baz | sed -re 's:^link=.*test\s*(.*):\1:' baz $ echo link= foo test bar test baz | perl -npe 's:^link=.*?test\s*(.*):\1:' bar test baz
Если я правильно понял задачу:
$ echo "link=this is url and test rest of string" | sed 's/\(^link=\)\(.*\)test\s*\(.*\)/\1\3/' link=rest of string
А если нужно и само слово test, то:
$ echo "link=this is url and test rest of string" | sed 's/\(^link=\)\(.*\)\(test.*\)/\1\3/' link=test rest of string
Только у меня в тексте вместо пробелов подчеркивание _, наверно по этому не срабатывает, а так спасибо большое, буду думать как подправить
Подчёркивания никак не влияют на работу sed — всё должно работать:
$ echo "link=this_is_url_and_test_rest_of_string" | sed 's/\(^link=\)\(.*\)\(test.*\)/\1\3/' link=test_rest_of_string
echo ‘link=this_is_url_and_test_rest_of_string’ | sed -e ‘/link=/ s:=.*_test_:=test_:’
Элементарно же.
подскажите пожалуйста как сделать также только с echo «link=this_is _url/and/test_rest_of_string»
% echo "link=this_is _url/and/test_rest_of_string" | sed -e '/link=/ s:=.*\(test_\):=\1:' link=test_rest_of_string
У тебя слэш в строке мешает правильному парсингу. Смотри, как quantum-troll написал.
Подсказка: в sed можно слэши заменять на некоторые другие символы — в частности, на : # и др.
$ echo "link=link=this_is _url/and/test_rest_of_string" | sed 's#\(^link=\)\(.*\)\(test.*\)#\1\3#' link=test_rest_of_string
Или с двоеточиями, как у quantum-troll, тоже работает.