сед

Примери за Bash Sed

Примери за Bash Sed
Bash ви позволява да извършите подмяна на шаблон, като използвате променливо разширение като ($ var / pattern / replacement). И така, сед ли е така (sed -e 's / pattern / replacement /'). Обаче има нещо повече, отколкото да замените шаблони в текстови файлове.  Тук ще преоткрием sed, например, с еквивалентни команди и работни потоци, за да подпомогнем ежедневните задачи.

Настройка за примери за sed

Ето кратко ръководство за настройка на примера, който ще се опитам да не прекалявам.

„Думи“ е текстов файл, съдържащ числата от 1 до 100. Ако не сте сигурни в командата, за да я създадете, вижте Експортиране на функция за xargs в Bash Export Command. Никога не знаете, че може да е на следващото ви интервю за скриптове на черупки.

“Bar” е текстов файл, съдържащ един ред -.

“Old-php” е текстов файл, съдържащ редове от стар PHP, който ще се счупи в php7 или по-нова версия. (Съвет: ereg)

Обърнете внимание, че всички описани по-горе функции могат да бъдат намерени по-долу в Endnote за функции за настройка.

Sed примери с еквивалентни команди

В среда на команден ред ще откриете, че има повече от едно решение на дадена задача. В по-голямата си част обаче искате да вървите по пътя, който дава най-малко съпротивление. Ето списък с примери на команди sed със съответните еквивалентни команди, където някои ще бъдат разгледани подробно по-долу.

1. Отпечатайте произволен ред (еквивалентно на сортиране -R - | глава -1)

sed -n "$ ((СЛУЧАЙНА% 100)) p" -

2.Отпечатайте последния ред във файла (еквивалентно на глава -1 -)

sed -n '$ p' -

3. Отпечатайте първите 10 реда във файл (еквивалентно на head -n 10 -)

sed '10q' -

4. Отпечатайте първия ред във файл (еквивалентно на tail -1 -)

sed -n '1p' -

5. Изтрийте всички екземпляри на символ (еквивалентно на tr -delete '0' -, където 0 е знакът, който искаме да изтрием)

sed -e 's / 0 // g' -

6. Конвертиране на csv файл в tsv (еквивалентно на tr ', "\ t' -)

sed -e 's /, / \ t / g' -

7.Добавяне на ред към файл (еквивалентно на котка бар -)

sed '$ a ---' -

8. Добавяне на ред във файл (еквивалентно на котка - бар)

sed '1i ---' -

9. Отпечатайте всички редове във файла (еквивалентно на cat -)

sed -n -e 'p' -

10. Отпечатайте редове, съответстващи на шаблон (еквивалентно на grep -e '^ 1' -)

sed -n -e '/ ^ 1 / p' -

11. Изтриване на редове, съответстващи на шаблон (еквивалентно на grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

12. Вземете броя на редовете във файл (еквивалентно на wc -l -)

sed -n -e '$ =' -

13. Записване във файл във фонов режим (еквивалентен команден тройник)

sed "w $ 1" -

Пример за използване на sed за изпълнение на командата tee

Точно по-горе има пример с надпис Във файл във фонов режим. Вид звучи като командата на тройника. Е, така е. Тук ще разгледаме как да приложим функция за заместване на tee в bash с помощта на sed.

Команди

тройник ()

тест $ # -eq 1 || връщане;
sed "w $ 1" -

главен ()

сл. 10 | тройник десет;
котка десет

основен

Изход

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Тук ще видите два списъка на целите числа от 1 до 10. Първият е от командата seq. Второто, което получаваме от котката на файла, написано в tee. Знам, че е нелепо, но работи!

Пример за използване на sed за отпечатване на произволен ред във файл

Да предположим, че искаме да отпечатаме произволен ред във файл, използвайки bash и малко sed. Можем ли да го направим? Да, можем! Ето как.

Внедрете функция, която

  1. Получава броя на редовете във файл, L
  2. Генерира произволно число между 1 и L, R
  3. Отпечатва R

Функцията очаква входът да бъде тръбопровод отвън.

Команди

някакъв ред ()

функция lc ()

sed -n -e '$ =' -
;
функция print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
котка -> $ temp;
котка $ temp | ред за печат $ ((СЛУЧАЙНО% $ (cat $ temp | lc) + 1));
rm $ temp

Пример за използване (1)

сл. 100 | _

Изход (1)

35

Пример за използване (2)

curl https: // linuxhint.com / bash_cut_command / --silent | ленти-тагове | някакъв ред

Вижте примера по-долу, като използвате sed за премахване на HTML тагове. Имайте предвид, че примерният пример понякога връща празно за празни редове. Като упражнение може да се подобри.

Използване на sed за отпечатване на редове във файл

Да предположим, че искате да приложите функция в bash за разпечатване на даден ред във файл. Опитът да отпечатате един ред във файл с помощта на цикъл в bash, head, tail или awk е твърде много работа за отпечатване на редове във файл. Добре, че имаме sed. Получената функция, използваща sed, ще бъде както следва.

Команди

ред за печат ()

sed -n "$ 1 p" -

Сега нека видим какво се случва, когато използваме линия за печат върху думи.

Команди

думи | линия за печат 50

Изход

50

добре. Изглежда добре, но нека опитаме нещо, което изглежда малко по-малко тривиално.

Команди

декларирайте -xf думи
декларирайте -xf линия за печат
sq 1 10 $ (думи | wc -l) | xargs -i bash -c "думи | ред за печат "

Изход

1
11
21
31
41
51
61
71
81
91

добре. Сега това е по-скоро така! Виждате как sed може да се използва в bash скрипт за отпечатване на който и да е ред във файл.

Sed примери без еквивалентни команди

В среда на команден ред понякога пътят до решение, което дава най-малко съпротивление, е sed начин; в противен случай в крайна сметка вършите повече работа, отколкото се изисква. Някои команди могат да бъдат представени по-долу.

Командирайте всички редове в скрипт на черупката

sed -e 's / ^ / # /' -
Изтрийте първия ред
sed -e '1d' -
Изтриване на последния ред
sed -e '$ d' -
Поставете ред преди линии, съответстващи на шаблон
sed '/ 0 $ / i ---' -
Вмъкнете ред след редове, съответстващи на шаблон
sed '/ 0 $ / ---' -
Отстранете html таговете
sed -e 's /<[^>] *.// g ' -
Надстройте ereg в стария php код, за да стартирате в php7 или по-нова версия
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Проверете дали sed е по-ранен от определена версия
sed -e 'v 4.5 ' -

Примерна версия на разклонение в bash

По-горе в примерите има ред за проверка дали sed е по-ранен от определена версия, която можем да използваме за реализиране на разклоняване на версиите в bash, което според мен е по-лесно, отколкото да се опитваме да внедрим функция за сравняване на номера на версиите от изхода sed -version. Единствената клопка е, че ако има по-ранна версия на sed, която не поддържа командата v, значи имаме проблеми.

Команди

test-sed-version-at-most ()
ехо -n | sed "v $ 1" - 2> / dev / null

try-version ()

echo -n "Версия $ 1. добре. Направете го ";
test-sed-version-at-$ 1 &&
ехо -n "стар";
вярно
||
echo -n "ново"
;
ехо "начин."

главен ()

местно v;
за v в 4.4,5;
направете
пробна версия $ v;
Свършен

основен

Изход

Версия 4.4. добре. Направете го по стария начин.
Версия 4.5. добре. Направи го по новия начин.

Имайте предвид, че версията на sed, работеща на моята машина, от момента на въвеждане на тези символи е 4.4, което би обяснило резултата по-горе. В същото време последната версия на gnu sed беше 4.7, около 3 години по-възрастен от този, който имам. Седлото ми е старо! Всъщност в sed 4.0.6 е добавен параметър към командата за версия, така че тази стратегия работи за всеки споменат поне v4.0.6, което е снизходително, като се има предвид, че версията е пусната в началото на 2003 г. Ти си добър.

Направих допълнително ровене, всъщност НОВИНИ, прочетени от най-новия изходен код. Версия 4.6 има нова функция -debug, която зарежда скрипта и коментира изходните редове. Това би ви позволило да превеждате sed скриптове, генерирани от функции в bash, в канонична форма. Готино! Само не забравяйте, че се нуждаете от разклонение на sed версия в bash. Това е мястото, където този сед пример влиза в игра.

Примерна функция bash, използваща sed за премахване на HTML тагове

В примерите по-горе има ред за премахване на HTML тагове. Нека да го хвърлим във функция bash и да я използваме, за да премахнем всички HTML тагове от последната статия, която написах.

Команди

ленти-тагове ()

sed -e 's /<[^>] *.// g ' -

curl https: // linuxhint.com / bash_cut_command / --silent | ленти-тагове

Не мога да кажа, че е перфектен, но поне се чете в терминала.

Sed примери с работни потоци: Примерен работен поток: безопасно заменете всички, използвайки find, grep и sed

Безопасно е да се каже, че промените, направени с помощта на sed с опцията -i, са необратими. Това е, освен ако не сте напълно сигурни какъв текст трябва да бъде заменен, вероятно ще се окажете с един знак по-малко от предвиденото. Ето защо в този пример ще използваме sed в работен процес, за да заменим безопасно текста във всички избрани от вас файлове.

Работния процес

  1. намирам
  2. grep
  3. сед
намирам

Тук ще изберете файловете, които подлежат на подмяна. Предлагам да използвате команда по тези линии:

намери -тип f -име | grep -v -e | xargs -i ..

Например, може да искате да ограничите файловете да заменят PHP файлове, с изключение на директориите на хранилището на git, както следва.

намери -тип f -име \ *.php | grep -v -e '.git '| xargs -i ..

Прочетете повече за командата xargs в bash.

grep

След това ще опитаме да съпоставим some_pattern в избраните файлове, както следва. Имайте предвид, че тъй като използваме опцията -o за grep, изходът ще покаже съвпадащ низ, ако има такъв.

намери -тип f -име \ *.php | grep -v -e '.git '|
xargs -i grep -e some_pattern -o

Командата по-горе трябва да върне списък с низове, съвпадащи с some_pattern.

сед

И накрая, искаме да заменим всички низове, съвпадащи с some_pattern. За да направим това, трябва да преобразуваме grep в sed, както следва.

намери -тип f -име \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / some_pattern / replacement / g

Командата grep става sed -i и опцията -o е премахната. И ето го.

Сега можете предварително да проверите какви низове ще бъдат заменени в sed вместо да тествате късмета си.

Крайни бележки за опциите, използвани в примери

Ето списък на опциите, използвани в разгледаните накратко примери sed.

Вариант Описание
-i Редактирайте на място. Ако входът е файл (не е въведен), резултатът от изразите ще замени съдържанието на файла.

Sed приема един

напр.) sed -n ..

-e означава израз. Неговият параметър е израз на езика sed.

Sed приема много

напр.) sed -e 'expr1' -e 'expr2' ..

Скрива ред, който не е засегнат от израза. Това е, ако изразът е оператор за печат на езика sed, тогава редовете, които не са включени в инструкцията за печат, няма да бъдат включени в изхода.

напр.) sed -n ..

За повече информация относно опциите sed, вижте sed -help

Крайни бележки за еквивалентни команди, използвани в примери

Следните помощни програми за командния ред са включени в примерите sed с еквивалентни команди.

Крайна забележка на крайния край - в пример еквивалентни команди

В случай, че се чудите какво се случва символът - в примера, тази бележка е за вас. Добавих знак - след повечето команди в примерите, за да намекна, че очакваме входът да бъде получен през тръба. Това е,

котка някакъв файл | сортиране -R - | глава -1

Когато обаче командата от лявата страна на тръбата е налице, можем да пропуснем намека, както следва.

котка някакъв файл | сортиране -R | глава -1

Това се случваше с символа - след команди в примерите.

Крайни бележки за функции за настройка

В случай, че търсите, ето функции за настройка за горните примери. Изходът, получен с помощта на деклариране -f. Прочетете повече за командата за деклариране в bash за повече употреби.

Команди

думи ()

сл. 100

лента ()

ехо ---

old-php ()

echo 'ereg ($ UA, "Bottybot")'

Долен ред

Харесваше ми да пиша примери за Bash sed и дори взех няколко допълнителни трика по пътя. Sed е мощна помощна програма за команден ред и изразителен език за манипулиране на текстови файлове. Ако ви е харесало да научите за sed, не се притеснявайте, има още много неща, които предстои да бъдат докоснати. Сед на.

Най-добрите дистрибуции на Linux за игри през 2021 г
Операционната система Linux е изминала дълъг път от първоначалния си, прост, базиран на сървъра външен вид. Тази операционна система се подобри неимов...
Как да заснемете и поточно предадете игралната си сесия на Linux
В миналото играта на игри се смяташе само за хоби, но с течение на времето игралната индустрия отбеляза огромен ръст по отношение на технологиите и бр...
Най-добрите игри за игра с ръчно проследяване
Oculus Quest наскоро представи страхотната идея за ръчно проследяване без контролери. С непрекъснато нарастващия брой игри и дейности, които изпълнява...