)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f2.5%2f" data-se-share-sheet-license-name="CC BY-SA 2.5" data-s-popover-placement="bottom-start">Share
@user229426: You mean unnecessary use of cat and cut, not useless, don't you?
– Manoj Govindan
Sep 20, 2010 at 5:00
This is a great explanation of using awk in combination with cut. I tried to get this exact thing for another use case and struggled a lot with awk man pages and awk tutorials. Thanks a lot for taking the time to explain your code!
– Kevin G.
Dec 22, 2015 at 12:28
Add a comment|
3
Use a regular expression to catch the id number and replace the whole line with the number. Something like this should do it (match everything up to "id mt24">
)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f2.5%2f" data-se-share-sheet-license-name="CC BY-SA 2.5" data-s-popover-placement="bottom-start">Share
Допустим у меня есть текст (txtxtxtxtxtxtxtxtxtxtxt «qweqweqwe» rfrfrfrfrf) вопрос в том что можно ли с помощью Sed удалить все до первой " и удалить все после последней " и чтобы в тексте осталось только «qweqweqwe»
echo txtxtxtxtxtxtxtxtxtxtxt \«qweqweqwe\» rfrfrfrfrf | sed -r «s|.+ (\».+\") .+|\1|"
Вопрос, почему такой вариант не полностью работает (надо писать в файл только последнее значение выдачи ping, без единиц измерения)
ping 192.168.1.1 > ping | sed = ping | sed -e 's\^.*time=\\; s/ms.*//' > ping
С awk таже хрень, что то тут с потоками я недоганяю
чопорно, но работает: while [ true ] ; do ping -c1 192.168.1.1 | grep -Eo «time=.* » | sed 's/time=//'; sleep 1; done
В файл не пишет, всё тоже самое
awk умеет fflush() , а гнутый sed опцию "-u", для остальных утилит иногда помогает (stdbuf)
Сколько можно штамповать темы об одном и том же? Спрашивай всё в одной. И вообще иди читать man sed , там же всё написано.. Ты уже столько людям мозги паришь одной своей задачей, что уже мог наизусть этот выучить и практикой закрепить за это время.
Как мы можем удалить текст от начала до некоторого определенного выбранного слова, используя команду sed в Linux
У меня есть простой запрос, связанный с выделением и заменой текста в Linux. Для объяснения вопроса я использую команду sed. У меня есть следующий текст.
Привет мир, я просто текст для отображения.
Теперь я хочу напечатать в hello world только я могу сделать это с помощью следующей команды в Linux.
echo "hello world, I am just simple text for display." | sed 's/, I am.*//g'
Теперь я хочу полностью изменить эту функцию, как я могу удалить hello world с помощью простой команды, как sed. Требуется вывод.Я просто текст для отображения. Будет очень полезно, если будут использоваться команды linux (sed и т. Д.). Спасибо
3 ответа
Чтобы отменить действие вашей команды И сохранить ту же часть строки для сопоставления (при условии, что это единственная исправляемая часть строки и вы хотите избавиться от любой другой части, которая может отличаться), вы можете сделать:
echo "hello world, I am just simple text for display." | sed 's/^.*\(, I am.*\)/\1/g'
, I am just simple text for display
Что делает регулярное выражение:
^.*: сопоставление любого символа в начале строки до следующего выражения
\( & \): перехватить часть строки, которая соответствует выражению между ними (должно быть экранировано \, иначе они будут соответствовать символу в скобках).
Я.*: Матч, который вы нам даете,
\ 1: будет заменен результатом совпадения первого подвыражения между круглыми скобками
Таким образом, вы получите точный обратный эффект команды в вашем вопросе, используя ту же часть строки для сопоставления.
Утилита sed это мощный потоковый редактор текста с поддержкой регулярных выражений. С помощью sed вы можете заменять шаблоны текста (причем непосредственно в файле!), удалять строки (элементы массива), выводить подходящие по маске строки (подобно grep). Редактор sed поддерживает применение нескольких команд и расширенный синтаксис регулярных выражений (при котором не нужно экранировать спец. символы).
Важно!
В sed нет поддержки опережающих и ретроспективных проверок в регулярках! Для замены с использованием расширенного синтаксиса regex используйте:
В 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. Активны спец символы: 3+ -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 .