Примери за Bash Sed

Bash Sed Examples



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

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

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







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



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



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





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

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

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



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

sed '$ ((СЛУЧАЙНО % 100)) p '-

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

sed '$ p'-

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

sed '10q'-

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

sed „1p“-

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

sed 's / 0 // g'-

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

sed 's/,/ t/g'-

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

sed '$ a ---'-

8. Предварителен ред към файл (еквивалентно на cat - bar)

sed '1i ---'-

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

sed 'p'-

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

sed '/^1/ p'-

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

sed '/^1/ d'-

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

sed '$ ='-

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

sed $ {1}'-

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

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

Команди

тройник ()
{
тест $ {#} -екв 1 || връщане;
sed $ {1}'-
}
главен()
тройниктова;
коткатова

главен

Изход

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 '$ ='-
};
функцияпечатна линия()
{
sed '$ {1}p '-
};
темп= $( mktemp );
котка-> $ {temp};
котка $ {temp} |печатна линия $((СЛУЧАЙНО%$( котка $ {temp} |lc)+1 ));
rm $ {temp}
}

Примерна употреба (1)

последователно 100 |_

Изход (1)

35

Примерна употреба (2)

навийте https://linuxhint.com/bash_cut_command/ -мълчалив |ленти-тагове|някаква линия

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

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

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

Команди

печатна линия()
{
sed '$ {1}p '-
}

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

Команди

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

Изход

петдесет

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

Команди

декларирам -xfдуми
декларирам -xfпечатна линия
последователно 1 10$(думи| тоалетна -на ) | xargsбаш -° С 'думи | линия за печат {} '

Изход

1
единадесет
двадесет и едно
31
41
51
61
71
81
91

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

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

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

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

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

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

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

Команди

test-sed-версия-най-много() {
изхвърлен | sed 'v$ {1}'-2> /dev/нула
}
try-версия()
{
изхвърлен 'Версия$ {1}. Добре. Направете го ';
test-sed-версия-най-много$ {1} && {
изхвърлен 'стар';
вярно
} || {
изхвърлен 'нов'
};
изхвърлен „начин“.
}
главен()
{
местенv;
заvв 4.{4,5};
направете
try-версия$ {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. Това е мястото, където този пример за sed влиза в игра.

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

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

Команди

ленти-тагове()
{
sed 's/*** .// g'-
}
навийте https://linuxhint.com/bash_cut_command/ -мълчалив |ленти-тагове

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

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

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

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

  1. намирам
  2. захващане
  3. sed
намирам

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

намирам -Типе-име | захващане -v| xargs-аз ...

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

намирам -Типе-име*.php| захващане -v '.отивам' | xargs ...

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

захващане

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

намирам -Типе-име*.php| захващане -v '.отивам' |
xargs захващане some_pattern-или

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

sed

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

намирам -Типе-име*.php| захващане -v '.отивам' |
xargs sed с/some_pattern/замяна/g

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

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

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

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

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

Сед приема едно

например) sed -n ...

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

Сед приема много

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

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

например) sed -n ...

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

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

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

  • вид
  • глава
  • опашка
  • захващане
  • котка
  • NS
  • тройник

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

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

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

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

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

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

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

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

Команди

думи()
{
последователно 100
}
бар()
{
изхвърлен ---
}
old-php()
{
изхвърлен 'ereg ($ UA,' Bottybot ')'
}

Долен ред

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