Аппараттық және бағдарламалық қамтамасыз етуді орнату

Linux командаларын үйрену: sed. SED ағындық редакторы sed пайдалану мысалдары


Авторы: Рарес Айоаней
Жарияланған күні: 2011 жылғы 19 қараша
Аудармасы: А.Кривошей
Тасымалдау күні: шілде 2012 ж

1. Кіріспе

sed, GNU нұсқасы бойынша сериямыздың екінші бөліміне қош келдіңіз. sed бағдарламасының бірнеше нұсқасы бар әртүрлі платформалар, бірақ біз GNU sed 4.x нұсқасына назар аударамыз. Сіздердің көпшілігіңіз sed туралы естідіңіз немесе оны ауыстыру құралы ретінде пайдаланған боларсыз. Бірақ бұл sed мақсаттарының бірі ғана және біз сізге осы қызметтік бағдарламаны пайдаланудың барлық аспектілерін көрсетуге тырысамыз. Оның атауы «Ағын өңдеушісі» дегенді білдіреді және бұл жағдайда «ағын» (ағын) сөзі файлды, құбырды немесе жай stdin дегенді білдіруі мүмкін. Сізде Linux туралы базалық білім бар деп үміттенеміз және егер сіз тұрақты өрнектермен жұмыс істеген болсаңыз немесе кем дегенде олардың не екенін білсеңіз, онда бәрі сізге оңайырақ болады. Мақаланың көлемі қосуға мүмкіндік бермейді толық нұсқаулықтұрақты тіркестер бойынша, оның орнына негізгі ұғымдарды дыбыстап, береміз көп саны sed пайдалану мысалдары.

2. Орнату

Бұл жерде айтатын көп нәрсе жоқ. Сізде sed орнатылған болуы мүмкін, өйткені оны әртүрлі жүйелік сценарийлер пайдаланады, сонымен қатар Linux пайдаланушыларыкөрсеткіштерін жақсартқысы келетіндер. Сіз sed нұсқасының қай нұсқасын орнатқаныңызды мына пәрмен арқылы біле аласыз:

$ sed - нұсқасы

Менің жүйемде бұл пәрмен менде GNU sed 4.2.1 орнатылған және оған сілтемелер бар екенін көрсетеді басты бетбағдарламалар және басқа да пайдалы ақпарат. Пакет таратылуына қарамастан «sed» деп аталады, ол жасырын түрде болатын Gentoo-дан басқа.

3. Ұғымдар

Әрі қарай бармас бұрын, «sed» не істейтініне назар аудару маңызды деп ойлаймыз, өйткені «ағындық редактор» оның мақсаты туралы көп айтпайды. sed мәтінді кіріс ретінде қабылдайды, әрбір жолда көрсетілген әрекеттерді орындайды (егер басқаша көрсетілмесе) және өзгертілген мәтінді шығарады. Бұл әрекеттер қосу, кірістіру, жою немесе ауыстыру болуы мүмкін. Бұл көрінетіндей оңай емес: ескертіңіз, sed пәрменін түсінуді қиындататын көптеген опциялар мен опциялардың комбинациясы бар. Сондықтан, оның қалай жұмыс істейтінін түсіну үшін тұрақты тіркестердің негіздерін үйренуді ұсынамыз. Нұсқаулықты жалғастырмас бұрын, біз Эрик Пементке және басқаларға шабыттандырғаны және sed тілін үйренгісі және пайдаланғысы келетін кез келген адамға жасағаны үшін алғыс айтқымыз келеді.

4. Тұрақты тіркестер

Сед пәрмендері (скрипттері) көпшілік үшін жұмбақ болып қала беретіндіктен, біздің оқырмандар негізгі ұғымдарды түсінуі керек деп ойлаймыз, мағынасын түсінбейтін пәрмендерді соқыр көшіріп, қоюға болмайды. Адам тұрақты тіркестердің не екенін түсінгісі келгенде, кілт сөз«сәйкестік», дәлірек айтқанда, «сәйкестік үлгісі». Мысалы, бөліміңізге арналған есепте желі сәулетшісіне сілтеме жасай отырып, Ник есімін жаздыңыз. Бірақ Ник кетіп, орнына Джон келді, сондықтан енді Ник сөзін Джон деп өзгерту керек. Есеп файлы report.txt деп аталса, келесі пәрменді орындау керек:

$ cat report.txt / sed "s/Nick/John/g" > report_new.txt

Әдепкі бойынша sed stdout функциясын пайдаланады, жоғарыдағы мысалда көрсетілгендей шығыс қайта бағыттау операторын пайдалануға болады. Бұл өте қарапайым мысал, бірақ біз бірнеше тармақты суреттедік: біз «Ник» үлгісінің барлық сәйкестіктерін іздейміз және олардың барлығын «Джон» деп ауыстырамыз. sed регистрді ескере отырып іздеу жасайтынын ескеріңіз, сондықтан абай болыңыз және барлық ауыстырулар жасалғанына көз жеткізу үшін шығыс файлын тексеріңіз. Жоғарыдағы мысалды келесідей жазуға болады:

$ sed "s/Nick/John/g" report.txt > report_new.txt

Жарайды, айтасыз, бірақ мұндағы тұрақты тіркестер қайда? Иә, біз алдымен мысал көрсеткіміз келді, ал енді ең қызықты бөлігі басталады.
«Ник» немесе «Ник» деп жазғаныңызға сенімді болмасаңыз және екі жағдайды да өңдегіңіз келсе, sed «s/Nick/nick/John/g» пәрменін пайдалануыңыз керек. Тік жолақтың C тілін оқыған-оқымағаныңызды білу керек деген мағынасы бар, яғни сіздің өрнек "ник" немесе "Ник" сәйкес келеді. Төменде көретіндей, арнаны басқа тәсілдермен пайдалануға болады, бірақ мағынасы бірдей. Тұрақты өрнектерде жиі қолданылатын басқа операторлар алдыңғы таңбаның нөлге немесе бір қайталануына сәйкес келетін "?" (яғни, flavou?r дәм мен дәмге сәйкес келеді), "*" нөл немесе бірнеше рет, "+" бір немесе бірнеше рет. «^» жолдың басына сәйкес келеді, ал «$» керісінше. Егер сіз vi немесе vim пайдаланушысы болсаңыз, көп нәрсе сізге таныс болып көрінеді. Өйткені, бұл утилиталар awk және C-мен бірге UNIX-тің алғашқы күндерінде өз тамырларына ие. Біз бұл туралы енді айтпаймыз, өйткені бұл таңбалардың мағынасын мысалдар арқылы түсіну оңайырақ, бірақ тұрақты өрнектердің әртүрлі іске асырылулары бар екенін білуіңіз керек: POSIX, POSIX Extended, Perl және анық емес тұрақты өрнектердің әртүрлі іске асырулары , сізге бас ауруы кепілдік береді.

5. sed қолдану мысалдары

Команда синтаксисі Сипаттама
sed "s/Nick/John/g" report.txt report.txt файлындағы Джонмен Никтің әрбір көрінісін ауыстырады
sed "s/Nick/nick/John/g" report.txt Ник немесе никтің әрбір көрінісін Джонмен ауыстырады.
sed "s/^/ /" file.txt >file_new.txt Басып шығару сапасын жақсарту үшін мәтіннің сол жағына 8 бос орын қосады.
sed -n "/Әрине/,/ назар аударыңыз \
төлеу/p" менің файлым
«Әрине» деп басталып, «сіз назар аударыңыз» деп аяқталатын бір абзацты шығарады
sed -n 12.18p файл.txt file.txt файлының 12-18 жолдарын ғана шығарады
sed12,18d файл.txt 12-18 жолдардан басқа file.txt файлын толығымен басып шығарады
sed G файлы.txt file.txt файлындағы бос орындарды екі есе көбейтеді
sed -f script.sed file.txt Барлық командаларды script.sed файлына жазады және оларды орындайды.
sed "5!s/ham/cheese/" file.txt 5-жолдан басқа file.txt файлында ветчинаны ірімшікпен ауыстырады
sed "$d" файлы.txt Соңғы жолды жояды
sed "/\(3\)/p" file.txt Үш цифры бар жолдарды ғана басып шығарады
sed "/boom/!s/aaa/bb/" файлы.txt Егер «бум» табылса, aaa сөзін bb деп ауыстырыңыз
sed "17,/disk/d" файл.txt 17-жолдан "дискке" дейінгі барлық жолдарды жояды
echo ONE TWO / sed "s/one/unos/I" Біреуін unos регистрін ескермейтінмен ауыстырады, сондықтан "unos TWO" басып шығарылады
sed "G;G" файлы.txt Файлдағы үш бос орын
sed "s/.$//" файл.txt dos2unix ауыстыру жолы :)
sed "s/^[ ^t]*//" file.txt file.txt файлындағы әрбір жолдың алдындағы барлық бос орындарды жояды
sed "s/[ ^t]*$//" file.txt file.txt файлындағы әрбір жолдың соңындағы барлық бос орындарды жояды
sed "s/^[ ^t]*//;s/[ ^]*$//" file.txt file.txt файлындағы әрбір жолдың басынан және аяғындағы барлық бос орындарды жояды
sed "s/foo/bar/" файлы.txt Жолдағы бірінші орынға ғана foo жолын ауыстырады.
sed "s/foo/bar/4" file.txt Жолдағы төртінші рет қана foo жолын ауыстырады.
sed "s/foo/bar/g" файлы.txt Жолдағы барлық оқиғалар үшін foo жолын ауыстырады.
sed "/baz/s/foo/bar/g" файлы.txt Жолда baz болса ғана foo-ны жолақпен ауыстырыңыз.
sed "/./,/^$/!d" file.txt EOF-тан басқа барлық қатардағы бос жолдарды жойыңыз
sed "/^$/N;/\n$/D" файл.txt Барлық қатардағы бос жолдарды жойыңыз, бірақ жоғарғы бос жолды қалдырыңыз.
sed "/./,$!d" файл.txt Барлық алдыңғы бос жолдарды алып тастаңыз
sed -e:a -e "/^\n*$/($d;N;);/\n$/ba" \
file.txt
Барлық кейінгі бос жолдарды алып тастаңыз
sed -e:a -e "/\\$/N; s/\\\n//; ta" \
file.txt
Егер файл кері қиғаш сызықпен аяқталса, оны келесі файлмен қосыңыз (қабық сценарийлері үшін пайдалы)
sed "/regex/,+5/expr/" Regex плюс келесі 5 жолға сәйкес келеді
sed "1~3d" файлы.txt Біріншіден бастап әрбір үшінші жолды жойыңыз.
sed -n "2~5p" файлы.txt Екіншіден бастап әрбір бесінші жолды басып шығарыңыз.
sed "s/ick/John/g" report.txt Жоғарыдағы мысалдардың кейбірін жазудың тағы бір жолы. Сіз өзіңізді ұсына аласыз ба?
sed -n "/RE/(p;q;)" файл.txt RE тек бірінші сәйкестігін басып шығарады ( тұрақты өрнек)
sed "0,/RE/(//d;)" file.txt Тек бірінші сәйкестікті жояды
sed "0,/RE/s//to_that/" файлы.txt Тек бірінші сәйкестікті өзгертеді
sed "s/^[^,]*,/9999,/" file.csv CSV файлындағы бірінші өрісті 9999 мәніне өзгертеді
s/^ *\(.*[^ ]\) *$//\1//; s/"*, */"//г; : цикл s// *\([^",/][^,/]*\) *, *//\1//g; s// *, *//\1//g; t цикл s / *////g;s// *///g;s/^/\(.*\)/$/\1/; CSV файлын бөлгіш ретінде тік жолағы бар файлға түрлендіруге арналған sed сценарийі (тек кейбір CSV түрлерімен, ендірілген тырнақшалар мен үтірлермен жұмыс істейді).
sed ":a;s/\(^\/[^0-9.]\)\(\+\)\(\(3\)\)/\1\2,\3/g;ta" файлы .жазу file.txt файлындағы сан пішімін 1234.56-дан 1.234.56-ға өзгертеді
sed -r "s/\<(reg/exp)+/\U&/g" reg немесе exp әрпінен басталатын кез келген сөзді бас әріпке түрлендіреді.
sed "1.20s/Johnson/White/g" file.txt Джонсонды тек 1 - 20 жолдарда Аққа өзгертеді.
sed "1,20 !s/Johnson/White/g" file.txt Алдыңғы мысал керісінше (1-20 жолдардан басқаның барлығын ауыстырады)
sed "/from/,/until/ ( s/\ /қызыл/г; \ s/\ /көгілдір/г; )" file.txt Тек "ден" және "дейін" арасында ауыстырылады
sed "/ENDNOTES:/,$ ( s/Schaff/Herzog/g; \ s/Kraft/Ebbing/g; )" file.txt Тек "СОҢҒЫ ЕСКЕРТПЕЛЕР:" сөзінен EOF дейін ауыстырылады
sed "/./(H;$!d;);x;/regex/!d" файл.txt Абзацты тек оның құрамында регекс болса ғана басып шығарады
sed -e "/./(H;$!d;)" -e "x;/RE1/!d;/RE2/!d;/RE3/!d" файл.txt RE1, RE2 және RE3 болса ғана абзацтарды басып шығарыңыз
sed "s/14"/on төрт дюйм/г" файл.txt Қос тырнақшаларды осылай пайдалануға болады
sed "s/\/some\/UNIX\/path/\/a\/new\/path/g" file.txt Unix жолдарымен жұмыс істеу
sed "s///g" файлы.txt file.txt файлынан a-дан басталатын және g-мен аяқталатын барлық таңбаларды жояды
sed "s/\(.*\)foo/\1bar/" file.txt foo параметрінің тек соңғы сәйкестігін жолақпен ауыстырады
sed "1!G;h;$!d" Tac пәрменін ауыстыру
sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//" rev пәрменін ауыстыру
sed 10q file.txt Бас командасын ауыстыру
sed -e:a -e "$q;N;11,$D;ba" \ file.txt tail командасын ауыстыру
sed "$!N; /^\(.*\)\n\1$/!P; D" \ file.txt Uniq пәрменін ауыстыру
sed "$!N; s/^\(.*\)\n\1$/\1/;\ t; D" file.txt Кері пәрмен (uniq -d баламасы)
sed "$!N;$!D" file.txt Құйрық -n 2 эквиваленті
sed -n "$p" файлы.txt ... құйрық -n 1 (немесе құйрық -1)
sed "/regexp/!d" file.txt grep эквиваленті
sed -n "/regexp/(g;1!p;);h" файл.txt Тұрақты өрнектің бірінші сәйкестігіне дейін келетін жолды басып шығарады, бірақ сәйкестіктің өзін қамтымайды.
sed -n "/regexp/(n;p;)" файл.txt Тұрақты өрнектің бірінші сәйкестігінен кейінгі жолды басып шығарады, бірақ сәйкестіктің өзін қоспайды.
sed "/pattern/d" файлы.txt Үлгіге сәйкес сызықтарды жояды
sed "/./!d" file.txt Файлдан барлық бос жолдарды жояды
sed "/^$/N;/\n$/N;//D" file.txt Алғашқы екеуінен басқа барлық қатардағы бос жолдарды жояды
sed -n "/^$/(p;h;);/./(x;/./p;)"\ file.txt Әрбір абзацтың соңғы жолын жояды
sed "/^$/q" Электрондық хаттың тақырыбын алады
sed "1,/^$/d" Хабардың негізгі мәтінін алады
sed "/^Тақырып: */!d; s///;q" Электрондық поштаның тақырыбын алады
sed "s/^/> /" Әр жолдың алдына «> » қою арқылы хабарламаға дәйексөз келтіреді
sed "s/^> //" Кері пәрмен (хабарламадан дәйексөзді алып тастайды)
sed -e:a -e "s/<[^>]*>//g;/ HTML тегтерін жояды
sed "/./(H;d;);x;s/\n/=(NL)=/g" file.txt / sort \ / sed "1s/=(NL)=//;s/=( NL)=/\n/g" file.txt ішіндегі абзацтарды алфавит бойынша сұрыптайды
sed» [электрондық пошта қорғалған]/usr/ [электрондық пошта қорғалған]&/[электрондық пошта қорғалған]"path.txt path.txt файлында /usr/bin орнына /usr/bin/local
sed» [электрондық пошта қорғалған]^.*[электрондық пошта қорғалған]<<<&>>>@g"path.txt Байқап көріңіз және көріңіз :)
sed "s/\(\/[^:]*\).*/\1/g" path.txt path.txt файлында $PATH болса, әрбір жолдағы бірінші жолды ғана басып шығарады
sed "s/\([^:]*\).*/\1/" /etc/passwd awk ауыстыру - тек passwd файлындағы пайдаланушыларды көрсетеді
echo "Welcome to The Geek Stuff" / sed \ "s/\(\b\)/\(\1\)/g" (W)come (T)o (T)he (G)eek (S)tuff Түсіндірместен түсінікті
sed -e "/^$/,/^END/s/hills/\ Mountains/g" file.txt «Төбелерді» «таулармен» ауыстырады, бірақ тек бос жолдан басталып, үш «СОҢҒЫ» таңбалары бар жолмен аяқталатын мәтін блоктарында ғана.
sed -e "/^#/d" /etc/services/more Қызметтер файлын түсініктемелерсіз көрсетеді
sed» [электрондық пошта қорғалған]\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\[электрондық пошта қорғалған]"path.txt path.txt файлының соңғы жолындағы элементтердің ретін өзгертеді
sed "/regex/(x;p;x;)" файл.txt Тұрақты өрнекке сәйкес келетін әрбір жолдың үстіне жаңа жолды кірістіреді
sed "/AAA/!d; /BBB/!d; /CCC/!d" file.txt Кез келген ретпен AAA, BBB және CCC іздейді
sed "/AAA.*BBB.*CCC/!d" файл.txt Берілген тәртіпте AAA, BBB және CCC іздейді
sed -n "/^.\(65\)/p" файл.txt 65 немесе одан көп таңбадан тұратын жолдарды басып шығарады
sed -n "/^.\(65\)/!p" файл.txt 65 немесе одан аз таңбадан тұратын жолдарды басып шығарады
sed "/regex/G" файлы.txt Әрбір жолдың астына бос жолды кірістіреді
sed "/regex/(x;p;x;G;)" файл.txt Әрбір жолдың үстіне және астына бос жолды кірістіреді
sed = file.txt / sed "N;s/\n/\t/" file.txt ішіндегі сандар жолдары
sed -e:a -e "s/^.\(1,78\)$/ &/;ta" file.txt Мәтінді оңға туралаңыз
sed -e:a -e "s/^.\(1,77\)$/ &/;ta" -e "s/\(*\)\1/\1/" файлы.txt Мәтінді ортаға туралаңыз

6. Қорытынды

Бұл sed туралы айтуға болатын нәрселердің бір бөлігі ғана, бірақ бұл мақалалар сериясы Unix утилиталарының толық қуатын бағалауға және жұмысыңызды тиімдірек етуге көмектеседі деп үміттенеміз.


Авторы: Рарес Айоаней
Жарияланған күні: 2011 жылғы 19 қараша
Аудармасы: А.Кривошей
Тасымалдау күні: шілде 2012 ж

Николай Игнатушко осы мақалада айтылған барлық командаларды Gentoo дистрибутивіндегі GNU sed 4.2.1 нұсқасында сынады. Барлық сценарийлер sed бағдарламасының GNU нұсқасында жақсы жұмыс істемеді. Бірақ іс түзетілген ұсақ-түйекке қатысты. Тек төбені таулармен ауыстыру сценарийін айтарлықтай өзгерту керек болды.

1. Кіріспе

sed, GNU нұсқасы бойынша сериямыздың екінші бөліміне қош келдіңіз. Әртүрлі платформаларда қол жетімді sed бағдарламасының бірнеше нұсқасы бар, бірақ біз GNU sed 4.x нұсқасына назар аударамыз. Сіздердің көпшілігіңіз sed туралы естідіңіз немесе оны ауыстыру құралы ретінде пайдаланған боларсыз. Бірақ бұл sed мақсаттарының бірі ғана және біз сізге осы қызметтік бағдарламаны пайдаланудың барлық аспектілерін көрсетуге тырысамыз. Оның атауы «Ағын өңдеушісі» дегенді білдіреді және бұл жағдайда «ағын» (ағын) сөзі файлды, құбырды немесе жай stdin дегенді білдіруі мүмкін. Сізде Linux туралы базалық білім бар деп үміттенеміз және егер сіз тұрақты өрнектермен жұмыс істеген болсаңыз немесе кем дегенде олардың не екенін білсеңіз, онда бәрі сізге оңайырақ болады. Бұл мақала тұрақты тіркестерге арналған толық нұсқаулықты қамту үшін жеткілікті үлкен емес, оның орнына біз негізгі ұғымдарды қарастырамыз және sed пайдаланудың көптеген мысалдарын береміз.

2. Орнату

Бұл жерде айтатын көп нәрсе жоқ. Сізде sed орнатылған болуы мүмкін, себебі оны әртүрлі жүйелік сценарийлер, сондай-ақ олардың тиімділігін арттырғысы келетін Linux пайдаланушылары пайдаланады. Сіз sed нұсқасының қай нұсқасын орнатқаныңызды мына пәрмен арқылы біле аласыз:

$ sed - нұсқасы

Менің жүйемде бұл пәрмен менде GNU sed 4.2.1 орнатылғанын, сонымен қатар бағдарламаның басты бетіне сілтеме және басқа пайдалы ақпарат бар екенін көрсетеді. Пакет таратылуына қарамастан «sed» деп аталады, ол жасырын түрде болатын Gentoo-дан басқа.

3. Ұғымдар

Әрі қарай бармас бұрын, «sed» не істейтініне назар аудару маңызды деп ойлаймыз, өйткені «ағындық редактор» оның мақсаты туралы көп айтпайды. sed мәтінді кіріс ретінде қабылдайды, әрбір жолда көрсетілген әрекеттерді орындайды (егер басқаша көрсетілмесе) және өзгертілген мәтінді шығарады. Бұл әрекеттер қосу, кірістіру, жою немесе ауыстыру болуы мүмкін. Бұл көрінетіндей оңай емес: ескертіңіз, sed пәрменін түсінуді қиындататын көптеген опциялар мен опциялардың комбинациясы бар. Сондықтан, оның қалай жұмыс істейтінін түсіну үшін тұрақты тіркестердің негіздерін үйренуді ұсынамыз. Нұсқаулықты жалғастырмас бұрын, біз Эрик Пементке және басқаларға шабыттандырғаны және sed тілін үйренгісі және пайдаланғысы келетін кез келген адамға жасағаны үшін алғыс айтқымыз келеді.

4. Тұрақты тіркестер

Сед пәрмендері (скрипттері) көпшілік үшін жұмбақ болып қала беретіндіктен, біздің оқырмандар негізгі ұғымдарды түсінуі керек деп ойлаймыз, мағынасын түсінбейтін пәрмендерді соқыр көшіріп, қоюға болмайды. Адам тұрақты тіркестердің не екенін түсінгісі келгенде, кілт сөз «сәйкестік» немесе дәлірек айтқанда, «сәйкестік үлгісі». Мысалы, бөліміңізге арналған есепте желі сәулетшісіне сілтеме жасай отырып, Ник есімін жаздыңыз. Бірақ Ник кетіп, орнына Джон келді, сондықтан енді Ник сөзін Джон деп өзгерту керек. Есеп файлы report.txt деп аталса, келесі пәрменді орындау керек:

$ cat report.txt | sed "s/Nick/John/g" > report_new.txt

Әдепкі бойынша sed stdout функциясын пайдаланады, жоғарыдағы мысалда көрсетілгендей шығыс қайта бағыттау операторын пайдалануға болады. Бұл өте қарапайым мысал, бірақ біз бірнеше тармақты суреттедік: біз «Ник» үлгісінің барлық сәйкестіктерін іздейміз және олардың барлығын «Джон» деп ауыстырамыз. sed регистрді ескере отырып іздеу жасайтынын ескеріңіз, сондықтан абай болыңыз және барлық ауыстырулар жасалғанына көз жеткізу үшін шығыс файлын тексеріңіз. Жоғарыдағы мысалды келесідей жазуға болады:

$ sed "s/Nick/John/g" report.txt > report_new.txt

Жарайды, айтасыз, бірақ мұндағы тұрақты тіркестер қайда? Иә, біз алдымен мысал көрсеткіміз келді, ал енді ең қызықты бөлігі басталады.
Егер сіз «ник» немесе «Ник» деп жазғаныңызға сенімді болмасаңыз және екі жағдайды да қарастырғыңыз келсе, sed «s/Nick|nick/John/g» пәрменін пайдалануыңыз керек. Тік жолақтың C тілін оқыған-оқымағаныңызды білу керек деген мағынасы бар, яғни сіздің өрнек "ник" немесе "Ник" сәйкес келеді. Төменде көретіндей, арнаны басқа тәсілдермен пайдалануға болады, бірақ мағынасы бірдей. Тұрақты өрнектерде жиі қолданылатын басқа операторлар алдыңғы таңбаның нөлге немесе бір қайталануына сәйкес келетін "?" (яғни, flavou?r дәм мен дәмге сәйкес келеді), "*" нөл немесе бірнеше рет, "+" бір немесе бірнеше рет. «^» жолдың басына сәйкес келеді, ал «$» керісінше. Егер сіз vi немесе vim пайдаланушысы болсаңыз, көп нәрсе сізге таныс болып көрінеді. Өйткені, бұл утилиталар awk және C-мен бірге UNIX-тің алғашқы күндерінде өз тамырларына ие. Біз бұл туралы енді айтпаймыз, өйткені бұл таңбалардың мағынасын мысалдар арқылы түсіну оңайырақ, бірақ тұрақты өрнектердің әртүрлі іске асырылулары бар екенін білуіңіз керек: POSIX, POSIX Extended, Perl және анық емес тұрақты өрнектердің әртүрлі іске асырулары , сізге бас ауруы кепілдік береді.

5. sed қолдану мысалдары

Команда синтаксисі Сипаттама

Sed "s/Nick/John/g" report.txt

report.txt файлындағы Джонмен Никтің әрбір көрінісін ауыстырады

Sed "s/Nick\|nick/John/g" report.txt

Ник немесе никтің әрбір көрінісін Джонмен ауыстырады.

Sed "s/^/ /" file.txt > file_new.txt

Басып шығару сапасын жақсарту үшін мәтіннің сол жағына 8 бос орын қосады.

Sed -n "/Әрине/,/назар аударыңыз/p" менің файлым

«Әрине» дегеннен басталып, «Назар аударыңыз» деп аяқталатын барлық абзацтарды басып шығарады.

Sed -n 12.18p файл.txt

file.txt файлының 12-18 жолдарын ғана шығарады

Sed 12,18d file.txt

12-18 жолдардан басқа file.txt файлын толығымен басып шығарады
file.txt файлындағы әрбір жолдан кейін бос жолды кірістіреді

sed -f script.sed file.txt

Барлық командаларды script.sed файлына жазады және оларды орындайды.

Sed "5!s/ham/cheese/" file.txt

5-жолдан басқа file.txt файлында ветчинаны ірімшікпен ауыстырады

"$d" файлы.txt

Соңғы жолды жояды

Sed -n "/\(3\)/p" файл.txt

Үш цифры бар жолдарды ғана басып шығарады

Sed "/boom/s/aaa/bb/" файлы.txt

Егер «бум» табылса, aaa сөзін bb деп ауыстырыңыз

Sed "17,/disk/d" file.txt

17-жолдан "дискке" дейінгі барлық жолдарды жояды. Бірнеше «диск» жолдары болса, біріншісіне дейін жояды.

Эхо БІР ЕКІ | sed "s/one/unos/I"

Біреуін unos регистрін ескермейтінмен ауыстырады, сондықтан "unos TWO" басып шығарылады

"G;G" файлы.txt

file.txt файлындағы әрбір жолдан кейін екі бос жолды кірістіреді

Sed "s/.$//" file.txt

dos2unix ауыстыру тәсілі :). Әдетте әр жолдағы соңғы таңбаны жояды.

Sed "s/^[ \t]*//" file.txt

file.txt файлындағы әрбір жолдың алдындағы барлық бос орындарды/қойындыларды жояды

Sed "s/[ \t]*$//" file.txt

file.txt файлындағы әрбір жолдың соңындағы барлық бос орындарды/қойындыларды жояды

Sed "s/^[ \t]*//;s/[ \t]*$//" file.txt

file.txt файлындағы әрбір жолдың басындағы және соңындағы барлық бос орындарды/қойындыларды жояды

Sed "s/foo/bar/" file.txt

Жолдағы бірінші орынға ғана foo жолын ауыстырады.

Sed "s/foo/bar/4" file.txt

Жолдағы төртінші рет қана foo жолын ауыстырады.

Sed "s/foo/bar/g" файлы.txt

Жолдағы барлық оқиғалар үшін foo жолын ауыстырады.

Sed "/baz/s/foo/bar/g" файлы.txt

Жолда baz болса ғана foo-ны жолақпен ауыстырыңыз.

Sed "/./,/^$/!d" file.txt

Барлық қатардағы бос жолдарды біреуіне қысыңыз. Жоғарғы жағында бос жол жоқ.

Sed "/^$/N;/\n$/D" файл.txt

Барлық дәйекті бос жолдарды біреуіне қысыңыз, бірақ жоғарғы бос жолды қалдырыңыз.

Sed "/./,$!d" file.txt

Барлық алдыңғы бос жолдарды алып тастаңыз

Sed -e:a -e "/^\n*$/($d;N;);/\n$/ba" file.txt

Барлық кейінгі бос жолдарды алып тастаңыз

Sed -e:a -e "/\\$/N; s/\\\n/ /; ta" file.txt

Егер жол кері қиғаш сызықпен аяқталса, оны келесі жолға қосыңыз (қабық сценарийлері үшін пайдалы)

Sed -n "/regex/,+5p" файл.txt

Реексті қамтитын жолдан кейін 5 жолды басып шығарады

Sed "1~3d" файл.txt

Біріншіден бастап әрбір үшінші жолды жойыңыз.

Sed -n "2~5p" файлы.txt

Екіншіден бастап әрбір бесінші жолды басып шығарыңыз.

Sed "s/ick/John/g" report.txt

Жоғарыдағы мысалдардың кейбірін жазудың тағы бір жолы. Сіз өзіңізді ұсына аласыз ба?

sed -n "/RE/(p;q;)" файл.txt

Бірінші RE (тұрақты өрнек) сәйкестігі бар жолды басып шығарады

Sed "0,/RE/(//d;)" file.txt

Бірінші сәйкестігі бар жолды жояды

Sed "0,/RE/s//to_that/" file.txt

Тек бірінші сәйкестікті өзгертеді

Sed "s/^[^,]*,/9999,/" file.csv

CSV файлының бірінші бағанындағы барлық мәндерді 9999 санына ауыстырады

S/^ *\(.*[^ ]\) *$/|\1|/; s/"*, */"|/g; : цикл s/| *\([^",|][^,|]*\) *, */|\1|/g; s/| *, */||/g; t цикл s/ *|/|/g ;s/|*/|/g;s/^|\(.*\)|$/\1/;

CSV файлын бөлгіш ретінде тік жолағы бар файлға түрлендіруге арналған sed сценарийі (тек кейбір CSV түрлерімен, ендірілген тырнақшалар мен үтірлермен жұмыс істейді).

Sed ":a;s/\(^\|[^0-9.]\)\(\+\)\(\(3\)\)/\1\2,\3/g;ta" файлы .жазу

file.txt файлындағы сан пішімін 1234.56-дан 1.234.56-ға өзгертеді

Sed -r "s/\<(reg|exp)+/\U&/g"

reg немесе exp әрпінен басталатын кез келген сөзді бас әріпке түрлендіреді.

Sed "1.20s/Johnson/White/g" file.txt

Джонсонды тек 1 - 20 жолдарда Аққа өзгертеді.

Sed "1,20 !s/Johnson/White/g" file.txt

Алдыңғы мысал керісінше (1-20 жолдардан басқаның барлығын ауыстырады)

Sed "/from/,/until/ ( s/\<red\>/magenta/g; s/<blue\>/cyan/g; )" file.txt

Тек "ден" және "дейін" арасын ауыстырады. Бірнеше "ден"-"дейін" аймақтары болса, олардың әрқайсысында ауыстырады.

Sed "/ENDNOTES:/,$ ( s/Schaff/Herzog/g; s/Kraft/Ebbing/g; )" file.txt

Тек "СОҢҒЫ ЕСКЕРТПЕЛЕР:" сөзінен EOF дейін ауыстырылады

Sed "/./(H;$!d;);x;/regex/!d" file.txt

Абзацты тек оның құрамында регекс болса ғана басып шығарады

Sed -e "/./(H;$!d;)" -e "x;/RE1/!d;/RE2/!d;/RE3/!d" файл.txt

RE1, RE2 және RE3 болса ғана абзацтарды басып шығарады. RE1, RE2 және RE3 реті маңызды емес.

Sed "s/14"/on төрт дюйм/г" файл.txt

Қос тырнақшаларды осылай пайдалануға болады

Sed "s/\/some\/UNIX\/path/\/a\/new\/path/g" file.txt

Unix жолдарымен жұмыс істеу

Sed "s///g" file.txt

file.txt файлынан a-дан басталатын және g-мен аяқталатын барлық таңбаларды жояды

Sed "s/\(.*\)foo/\1bar/" file.txt

Жолдағы foo сөзінің тек соңғы сәйкестігін жолақпен ауыстырады

Sed "1!G;h;$!d"

Tac пәрменін ауыстыру

Sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//"

rev пәрменін ауыстыру

Sed 10q file.txt

Бас командасын ауыстыру

Sed -e:a -e "$q;N;11,$D;ba" файлы.txt

tail командасын ауыстыру

Sed "$!N; /^\(.*\)\n\1$/!P; D" file.txt

Uniq пәрменін ауыстыру

Sed "$!N; s/^\(.*\)\n\1$/\1/;t; D" file.txt

Кері пәрмен (uniq -d баламасы)

Sed "$!N;$!D" file.txt

Құйрық -n 2 эквиваленті

sed -n "$p" файлы.txt

... құйрық -n 1 (немесе құйрық -1)

Sed "/regexp/!d" file.txt

grep эквиваленті

Sed -n "/regexp/(g;1!p;);h" файл.txt

Тұрақты өрнектің бірінші сәйкестігіне дейін келетін жолды басып шығарады, бірақ сәйкестіктің өзін қамтымайды.

sed -n "/regexp/(n;p;)" файл.txt

Тұрақты өрнектің бірінші сәйкестігінен кейінгі жолды басып шығарады, бірақ сәйкестіктің өзін қоспайды.

sed "/pattern/d" файлы.txt

Үлгіге сәйкес сызықтарды жояды

Sed "/./!d" file.txt

Файлдан барлық бос жолдарды жояды

Sed "/^$/N;/\n$/N;//D" file.txt

Барлық дәйекті бос жолдарды екі бос жолға қысады. Жалғыз бос жолдар өзгертілмейді.

Sed -n "/^$/(p;h;);/./(x;/./p;)" file.txt

Әрбір абзацтың соңғы жолын жояды
Электрондық хаттың тақырыбын алады. Басқаша айтқанда - бірінші бос жолдан кейін бәрін жояды.

sed ағынды біріншіден бастап және соңғысына дейін дәйекті түрде өңдейді (әрине, егер sed сценарийінде басқаша көрсетілмесе, мысалы, сіз тек бірінші жолдарды өңдей аласыз және кейбір шарт орындалғаннан кейін өңдеуді тоқтата аласыз. ), әдетте әрбір жол жеке, үш кезеңде өңделеді.

Маңызды

Төмендегі схемаға болашақта жиі сілтеме жасалады, мысалы, «жолды өңдеудің бірінші кезеңінде» тек осы схеманың бірінші кезеңін білдіреді.

Процедура 2.1. sed арқылы мәтінді өңдеу.

    Бұл кезеңде жол буферге жүктеледі. Буфер – бұл sed арқылы бөлінген жады аймағы, оның өлшемі шектелмейді (sed-дің GNU нұсқасы үшін, әрине, іс жүзінде өлшем оперативті жады және своп жады көлемімен шектеледі).

    Жүктеп алу ағыннан жаңа жол таңбасы (\n) оқылғанда немесе ағын аяқталғанда аяқталады. Бұл жағдайда жаңа жол таңбасы ағыннан оқылса да, буферге жазылмайды.

    Жолды өңдеу.

    Бұл кезеңде sed сценарийі орындалады және әдетте буфердің мазмұны өзгертіледі. sed-script арнайы sed-командалардан тұрады, олардың әрқайсысы латын әліпбиінің әріптерінің бірін білдіреді. Әдеттегідей, кіші және жоғарғы әріптер ерекшеленеді: nжәне Нолар әртүрлі командалар. Пәрмен жолында sed пәрмендерін және оның қосқыштарынан кейін бірден жазу оңай, мысалы:

    sed -n "p;p;p"

    Пәрмендерді бөлу үшін нүктелі үтір (;) қолданылады.

    Ескерту

    Сценарийлерді пәрменнен кейін бірден жазсаңыз, оларды әрқашан жалғыз «тырнақшаға» қойыңыз, бұл жағдайда ғана қабық бұл сценарийлерді өңдемейді, кейбір жағдайларда қос тырнақшаларды қолдануға болады, мысалы, егер сіз қабық сценарийінің ішіне -variable қойғыңыз келеді, бірақ абай болыңыз: қабық сценарийіңіздегі көптеген қызмет көрсету таңбаларын кеңейтуге тырысады.

    Анықтама

    Егер сценарий ішінде бір тырнақша таңбасын пайдалану қажет болса, оның он алтылық көрінісін пайдалануға болады: « \x27".

    sed пәрмендері буфердің мазмұнын өзгерте алады, бірақ сонымен қатар, басқа бағдарламалау тілдеріндегі сияқты, sed сценарийлерінде шартты және шартсыз өтулерді қолдануға болады ( б , т, және Т), үзу командалары да бар ( qжәне Q). Кейбір пәрмендер жолды өңдеу кезеңіне ғана емес, сонымен қатар басқа кезеңдерге де әсер етеді, бұдан басқа, сценарий ішінде кіріс ағынынан бір немесе бірнеше жолды енгізуге болады (бірінші кезеңдегідей).

    Маңызды

    sed файлмен емес, ағынмен жұмыс істейтінін түсіну керек, ол тек жолдарды басынан аяғына дейін дәйекті түрде сканерлейді. Сондықтан жиырмадан кейін оныншы жолды оқу мүмкін емес - егер бұл қажет болса, оны өңдеу кезінде оныншы жолды сақтау керек. Сондай-ақ, ағынның басынан бастап жол нөмірін анықтауға әбден болатынына қарамастан, берілген жолдың, мысалы, соңғы жол екенін білу мүмкін емес. Сіз бұл жолдың соңғы екенін біле аласыз, бірақ оны өңдеу кезінде ғана.

    Кез келген sed пәрменінің алдында (дерлік) мекенжай өрнегін префикспен қоюға болады, бұл жағдайда команда мекенжай өрнегі ақиқат болса ғана орындалады. Мақсатты өрнек ретінде пайдалануға болады

    Жол нөмірі Содан кейін команда нөмірі көрсетілген жол үшін ғана орындалады Жол нөмірлерінің диапазоныПәрмен көрсетілген ауқымдағы барлық жолдар үшін орындалады (ауқым үтірмен бөлінген, екінші санның орнына `$ көрсетуге рұқсат етіледі), бұл таңба соңғы жолды білдіреді. Тұрақты өрнек

    Пәрмен берілген RE буферде табылған жағдайда ғана орындалады.

    Біріктірілген диапазон.

    Сіз күрделірек шартты жасай аласыз, мысалы, берілген RE-ден және $ жолына дейін (соңына дейін). Немесе бірінші ЖЭ-ден екіншісіне дейін (қоса алғанда).

    Түсініктеме

    sed ішіндегі жолдар бірден бастап нөмірленеді. Алдымен диапазонның бірінші адресімен сәйкес келетін жолды іздеу жүргізіледі және осы жолға команда орындалады. Келесі жолдан бастап диапазонның екінші мекенжайы ізделеді. Дегенмен, бірінші жол үшін бұл әрекетті өзгертуге болады: егер сіз «1,RE» емес, «0,RE» деп жазсаңыз, онда тұрақты өрнек бірінші жолда дәл осылай тексеріледі.

    Анықтама

    Бір мекенжай өрнегі бірден бірнеше пәрменде әрекет етуін қаласаңыз, бұл пәрмендерді (бұйра жақшалар) ішіне қойыңыз.

    Түсініктеме

    Кірістірілген блоктарға рұқсат етіледі, сонымен қатар блок ішінде мекенжай өрнектерін пайдалануға рұқсат етіледі, соның ішінде. және кірістірілген блоктар үшін.

    Пәрменнен кейін бірден сценарий жазудан басқа, оны файлға жазуға болады, мұндай файлды орындау үшін -f опциясын пайдалануға болады, мысалы:

    $ sed -f my_script.sed test_file.txt

    Бұл пәрмен test_file.txt файлында my_script.sed sed сценарийін орындайды. Сондай-ақ, sha-bang пайдалану

    #!/bin/sed -f

    сіз қабықты сценарийлерді орындауға мәжбүрлей аласыз, мысалы, егер сіз осы sha-bang-ті сценарийге бірінші жолға қоссаңыз және қосымша осы сценарийді орындауға құқығыңыз болса, онда алдыңғы мысалды келесідей орындауға болады:

    $ ./my_script.sed test_file.txt

    Ескерту

    Алдымен файлдарға бірнеше пәрмен бар барлық sed сценарийлерін жазуды ұсынар едім. Біріншіден, оларды түсіну әлдеқайда оңай, екіншіден, олар осылай сақталады, үшіншіден, өңдеуге әлдеқайда ыңғайлы. Сондай-ақ, sed файлдарында кез келген тырнақшаларды пайдалануға болады. Сондай-ақ, кейбір пәрмендер жолдың соңында жазылуы керек екенін ескеру керек, егер тек бір жол болса, бұл мүмкін емес. Соңында, сіз жаңа қолданбаға дайын сценарийді жылдам бейімдеуге мүмкіндік беретін файлдағы түсініктемелерді пайдалана аласыз.
  1. буфер шығысы

    Сценарий аяқталғанда, sed буфер мазмұнын шығыс ағынына басып шығарады. Дегенмен, бұл әрқашан қажет емес, егер сізге қажет болмаса, буфердің шығысын блоктайтын -n опциясын пайдаланыңыз. Сонымен қатар, сол кезеңде, егер командалар сценарийде орындалса, кейбір басқа ақпарат көрсетіледі а , в, және/немесе мен. Бұл командалар ақпаратты шығыс ағынына да шығарады, бірақ орындау кезінде емес, осы кезеңде. Үш команда бар ( г , Dжәне Q), ол да осы кезеңде буфер шығысын басады.

Бірінші sed сценарийлері.

Оқуды бастау үшін sedбізге осындай қарапайым мәтін қажет:

2.1-мысал. Мәтін сценарийлерді тексеру үшін қолданылады.

Сіз шотқа Яндекс ақшасының аз мөлшерін бере аласыз 41001666004238 хостинг, интернет және т.б. үшін төлеуге. Бұл, әрине, ерікті, бірақ бұл құжатты айтарлықтай жақсартады (оны жақсартуға көбірек уақытым болады). Шын мәнінде, жоба жабылу алдында жиі болады, өйткені ол ешқашан ақша әкелмеген және әкелмейді. Сен маған көмектесе аласың ба. Рақмет сізге.

Sed – жеңіл (екілік салмағы бар болғаны 128 килобайт) және мәтінді өңдеуге ыңғайлы құрал.

Бұл мақалада мен пайдаланудың бірнеше қарапайым мысалдарын беремін sedжәне оның негізгі ерекшеліктері туралы айту.

Sed кіріс ағынын немесе файлды жол бойынша қабылдайды, әрбір жолды sed сценарийінде анықталған ережелерге сәйкес өңдейді, содан кейін нәтижені басып шығарады. Sed – Тьюрингтің толық бағдарламалау тілі.

sed пәрмен пішімі

sed пәрменінің пішімі бар:

sed [ -n ] [ -e сценарий ] [ -f сценарий файл ] [ файлдар ]

Жалау -nшығуды басады
- пәрмен жолында берілген нұсқаулар тізімін көрсетеді.
- сценарий файлының орнын көрсетеді.

Пәрмен пішімін өңдеу

Сценарий файлы пәрмендер жинағынан тұрады:

[ мекенжай [ , мекенжай ] ] пәрмен [ аргументтер ]

әр жолға бір.
Адрестер не жол нөмірлері, не арнайы таңбалар, не тұрақты өрнек:

$ - соңғы жол
бастау ~ Н- Әрқайсысы Н-саннан басталатын жол Бастау
/тұрақты өрнек/- тұрақты_өрнекке сәйкес келетін жолдар
Мысалдар:

1~2 - Әрбір екінші жол /REGEXP/- бар барлық жолдар /REGEXP/ 10,20 - 10-нан 20-ға дейінгі жолдар 10,+10 - 10-нан 20-ға дейінгі жолдар 5~N- 5-тен басталатын және біріншіге дейінгі жолдар, еселік Н 5, /REGEXP/- бар жолдар /REGEXP/, 5-тен кейін (5-ін қоспағанда)
  • Егер мекенжай көрсетілмесе, барлық жолдар өңделеді.
  • Егер бір мекенжай көрсетілсе, сәйкес жол өңделеді
  • Егер екі адрес көрсетілсе, онда берілген интервалдағы жолдар таңдалады.
  • !команда- орындалды команда, мекенжай бойынша таңдалмаған жолдар үшін.

Негізгі командалар

Негізгі командаларды қарастырыңыз:

[мекенжай] мәтін- көрсетілген жолдан кейін мәтіні бар жаңа жолды қосыңыз

$ cat sed_test sed_test_1 11111 sed_test_2 22222 sed_test_3 33333 $ sed -e "2 a new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line sed_test_3 33333

[мекенжай [, мекенжай]] c мәтін- Таңдалған жолдарды жояды және олардың орнына қояды мәтін

$ sed -e "2 new_line" sed_test sed_test_1 11111 new_line sed_test_3 33333 $ sed -e "/3/ with new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line

[мекенжай [, мекенжай]] d- Көрсетілген жолдарды жояды.

$ sed -e "2 d" sed_test sed_test_1 11111 sed_test_3 33333 $ sed -e "2!d" sed_test sed_test_2 22222

[мекенжай] мен мәтін- Енгізу мәтінкөрсетілген жолдың орнына.

$ sed -e "2 i new_line" sed_test sed_test_1 11111 new_text sed_test_2 22222 sed_test_3 33333

[мекенжай [, мекенжай]] б(жалаумен -n) табылған жолдарды басып шығарады.

$ sed -ne "2p" sed_test sed_test_2 22222

[мекенжай] q- sed ішінен шығу.

[мекенжайы [, мекенжай]] r файлы-Оқып жатыр файлжәне оның мазмұнын шығарады.

[адрес [, мекенжай]] s/regex/replacement/жалаушалар- алмастырады тұрақты өрнекүстінде ауыстыру-y жалаушалары бар:

  • g - бүкіл сызықта
  • i - регистрді ескермейді
  • p – ауыстыру нәтижесін көрсету
$ sed -ne "s/t/T/g" sed_test sed_TesT_1 11111 sed_TesT_2 22222 sed_TesT_3 33333 $ sed -e "s//d/g" sed_test sed_test_d dddd sed_test_d test kdddddd sed_test dd_dddd_

[мекенжай[, мекенжай]] y/1-жол/2-жол/- таңбалардың барлық кездесулерін ауыстырады 1-жолсәйкес таңбалар жолдар2. Жолдардың ұзындығы бірдей болуы керек.

$ sed -ne "y/est/EST/g" sed_test SEd_TEST_1 11111 SEd_TEST_2 22222 SEd_TEST_3 33333

[мекенжай[, мекенжай]] (пәрмендер)- жақшалар тобы командалары
[мекенжай] =- Жол нөмірлерін береді

Тегтер

: заттаңба- командалар тобына көрсету заттаңба
b белгісі заттаңба, егер заттаңбажоқ, содан кейін пакеттік файлдың соңына өтіңіз.

t белгісі- белгімен көрсетілген командаға өту заттаңбапәрменді пайдаланып сәтті ауыстырғаннан кейін ғана с///

Іске қосу циклі

sed екі деректер буферімен жұмыс істейді: негізгі және көмекші. Екі буфер де бастапқыда бос.
Бұл буферлермен жұмыс істеу мына командалар арқылы орындалады:\\`h`, `H', `x', `g', `G` `D' h- Көмекші буфердің мазмұнын негізгінің мазмұнымен ауыстырыңыз
Х- Көмекші буферге жаңа жолды қосыңыз, содан кейін негізгі буфердің мазмұнын көмекші буфердің мазмұнына қосыңыз
x- Екі буфердің мазмұнын ауыстырыңыз
g- Негізгі буфердің мазмұнын көмекші заттың мазмұнымен ауыстырыңыз
Г- Негізгі буферге жаңа жолды қосыңыз, содан кейін негізгі буфердің мазмұнына қосалқы буфердің мазмұнын қосыңыз.
D- Негізгі буфер мәтінін келесі жаңа жол таңбасына дейін жою
Н- Негізгі буферге жаңа жолды қосыңыз, содан кейін өңделетін келесі жолды қосыңыз
П- Негізгі буфердің мазмұнын келесі жаңа жол таңбасына дейін шығару.

Неғұрлым күрделі мысалдар

Келесі сценарий файл жолдарын ауыстырады (бірінші жолдар соңғы болады және керісінше)

$ cat tac.sed #!/usr/bin/sed -nf # екінші жолдан бастап, ағымдағы жолға буфердің мазмұны (оның құрамында # барлық алдыңғы жолдар бар) қосылады. бір! G # соңғы жолға жеткенде, басып шығарыңыз $ p # Буферді қайтадан h sed -nf tac.sed sed_test sed_test_3 33333 sed_test_2 22222 sed_test_1 11111

Файлдың жолдарын оқу (соңғы жолдың нөмірін көрсету)

$ cat count.sed #!/usr/bin/sed -nf $=

нәтиже

$ sed -nf count.sed sed_test 3

Жолды ауыстыру

$ cat revers.sed #!/usr/bin/sed -f # бір әріпті жолдарды өткізіп жіберу /../! b # Жолды кері айналдырыңыз. Ағымдағы жолға дейін және кейін бос жолды қосыңыз. с/% [электрондық пошта қорғалған]~*!G4;:%#`.*$/\ &\ / # Бірінші таңбаны соңына дейін жылжытыңыз # ортаңғы жолда таңбалар болғанша цикл орындалады. tx:x s/\(\\n.\)\(.*\)\(.\\n\)/\\3\\2\\1/ tx #қосымша жол үзілімдерін жою s/\\n// g

Бұл сценарий бір уақытта екі әріпті жылжытады.

$ sed -f revers.sed sed_test 11111 1_tset_des 22222 2_tset_des 33333 3_tset_des

қосымша ақпарат

Сіз нұсқаулықты оқу арқылы sed сценарийлерінің пішімі туралы көбірек біле аласыз адам седнемесе техникалық құжаттама ақпарат sed.

TITLE

sed - ағындық редактор

СИНТАКС

sed [-Ealn] пәрмені

sed [-Ealn] [-e пәрмені] [-f команда_файлы] [-i кеңейтімі]

СИПАТТАМАСЫ

sed утилитасы көрсетілген файлды оқиды немесе стандартты енгізуді, егер файл көрсетілмесе, енгізуді пәрмендер тізімінде көрсетілгендей өзгертеді. Содан кейін кіріс стандартты шығысқа жазылады.Бір команда sed үшін бірінші аргумент ретінде берілуі мүмкін. Бірнеше пәрмендерді -e немесе -f опциялары арқылы көрсетуге болады. Барлық пәрмендер шығу тегіне қарамастан, олар көрсетілген ретпен қолданылады. Келесі опциялар қолжетімді:

Тұрақты тіркестерді негізгі тұрақты тіркестерге қарағанда кеңейтілген (қазіргі) тұрақты тіркестер ретінде жиі түсіндіреді. re_format(7) құжаттама беті екі пішімді де толық сипаттайды.

"w" функциясының параметрлері ретінде тізімделген файлдар әдепкі процесс басталғанға дейін жасалады (немесе жойылады). -a опциясы байланысты "w" функциясын қамтитын пәрмен кіріс жолына қолданылғанша sed әр файлды ашуды кешіктіреді.

Пәрмен аргументі арқылы көрсетілген өңдеу пәрмендерін пәрмендер тізіміне қосады

пәрмендер тізіміне command_file ішінде табылған өңдеу пәрмендерін қосады. Әрбір өңдеу пәрмені бөлек жолда жазылуы керек.

Көрсетілген кеңейтіммен сақтық көшірмені сақтай отырып, ауыстыру файлдарын өңдейді. Кеңейтім көрсетілмесе (нөлдік ұзындық), сақтық көшірме сақталмайды. Ауыстырылған файлдарға нөлдік кеңейтімді тағайындау ұсынылмайды, өйткені дискілік кеңістік пайдаланылған кезде файлды толық немесе ішінара бұзу қаупі бар.

шығыс сызықтарының буферін жасайды.

әдепкі бойынша, барлық пәрмендер қолданылғаннан кейін кірістің әрбір жолы стандартты шығысқа басып шығарылады. -n опциясы бұл әрекетті қайта анықтайды.

sed командаларының пішіні келесідей:

]функциясы

Пәрмен функциясының бірінші мекенжайы мен бөліктерінің алдында бос орындар (бос орындар) кірістірілуі мүмкін.

Әдетте sed кейінгі жаңа жолды қоспай, енгізу жолы арқылы бос орындар үлгісіне айналдырады (біреуі «D» функциясынан шыққанша) сол үлгіні таңдаған мекенжайлары бар барлық пәрмендерді қолданады, үлгіні жаңа жол таңбасын қоса отырып, stdout файлына көшіреді. және үлгіні жою.

Кейбір функциялар кейінірек шығарып алу үшін үлгінің барлығын немесе бір бөлігін сақтау үшін ұстау кеңістігін пайдаланады.

Sed мекенжайлары

Мекенжай міндетті емес, бірақ көрсетілген болса, мекенжай сан (енгізу файлдарының жолдарын санайтын), соңғы енгізілген жолды көрсететін доллар белгісі ('$') немесе мәтінмәндік мекенжай (тұрақты өрнекті қамтитын) болуы керек. оның алдында және артында тұратын, бөлгіш).

Адрестері жоқ пәрмен жолы әрбір үлгіні таңдайды Бір мекенжайы бар пәрмен жолы мекенжайға сәйкес келетін барлық үлгілерді таңдайды.

Екі мекенжайы бар пәрмен жолы қамтитын ауқымды таңдайды. Ауқым бірінші мекенжайға сәйкес келетін бірінші үлгіден басталады. Ауқымның соңы екінші мекенжайға сәйкес келетін келесі үлгі болып табылады. Егер екінші мекенжайдың нөмірі біріншінің жол нөміріне тең немесе одан аз болса, онда сол жол таңдалады.

Екінші мекенжай мәтінмәндік мекенжай болған жағдайда, sed екінші мекенжайды бірінші мекенжайға сәйкес келетін үлгімен салыстырмайды. Бірінші жолдан бастап, таңдалған ауқымнан кейін sed бірінші мекенжайды қайтадан іздей бастайды.

Пәрменді өңдеуді таңдалмаған үлгілерге («!») таңбасы арқылы қолдануға болады.

sed тұрақты тіркестер

sed тілінде қолданылатын тұрақты өрнектер әдепкі бойынша негізгі тұрақты өрнектер болып табылады (толығырақ ақпарат алу үшін re_format(7) бөлімін қараңыз), бірақ -E жалауы пайдаланылса, оның орнына кеңейтілген (жаңа) тұрақты өрнектерді пайдалануға болады.

Сонымен қатар, sed тұрақты өрнектерге келесі қосымшалар бар:

1. Мәтінмәндік мекенжайда кері қиғаш сызықтан ("\") немесе жаңа жол таңбасынан басқа кез келген таңба тұрақты өрнекті шектеу үшін пайдаланылуы мүмкін. Сондай-ақ, шектейтін таңба алдында кері қиғаш сызықты пайдалану таңбаны таңба болуға мәжбүр етеді. Мысалы, xabcxdefx контекстік мекенжайында тұрақты өрнектегі шектейтін таңба «x», екінші «x» әріп болады, сондықтан тұрақты өрнек «abcxdef» болады.

2. тізбектер
үлгіге енгізілген жаңа жол таңбасына сәйкес келеді. Мекенжай немесе ауыстыру пәрменінде жаңа жол таңбаларын пайдалана алмайсыз.

sed тұрақты өрнектерге тән жалғыз мүмкіндік - бұл әдепкі бойынша соңғы пайдаланылған тұрақты өрнекке қатысты болатын мүмкіндік. Егер тұрақты өрнек бос болса, яғни шектейтін таңба ғана көрсетілсе, онда соңғы пайдаланылған тұрақты өрнек пайдаланылады. Соңғы тұрақты өрнек компиляция уақытында емес, іске қосу уақытында мекенжай немесе ауыстыру пәрменінің бөлігі ретінде пайдаланылған соңғы тұрақты өрнек ретінде анықталады. Мысалы, «/abc/s//XXX/» пәрмені «XXX» сөзін «abc» үлгісімен ауыстырады.

sed функциялары

Келесі пәрмендер тізімінде әрбір пәрмен үшін рұқсат етілген мекенжайлардың ең көп саны нөл, бір немесе екі мекенжайды білдіретін , , немесе ретінде көрсетіледі. Мәтіндік аргумент бір немесе бірнеше жолды қамтиды. Мәтінге жаңа жол таңбасын қосу үшін оның алдына кері қиғаш сызық таңбасын қойыңыз. Мәтіндегі басқа кері қиғаш сызық таңбалары жойылады және олардан кейінгі таңбалар таңбалар ретінде қарастырылады.

"r" және "w" функциялары қосымша файл аргументін алады, ол функция таңбасынан бос орын арқылы бөлінуі керек. sed үшін аргумент ретінде берілген әрбір файл кез келген енгізуді өңдеу басталғанға дейін жасалады (немесе қысқартылады).

'b', 'r', 's', 't', 'w', 'y', '!' және ':' функциялары қосымша аргументтерді қабылдайды. Келесі мысал қандай аргументтерді функция таңбаларынан бос орындар арқылы бөлу керектігін көрсетеді.

Екі функция функциялар тізімін құрайды. sed функцияларының тізімі келесі мысалда көрсетілгендей жаңа жолдармен бөлінген:

"(" алдында бос орын және бос орын болуы мүмкін. Функциялардың алдында бос орын болуы мүмкін. ")" соңынан жаңа жол таңбасы немесе бос орын болуы мүмкін.

Функциялар тізімі Үлгі таңдалғанда ғана функциялар тізімін іске қосады.

мәтін «N» функциясы пайдаланылғанына немесе жаңа цикл басталғанына қарамастан, енгізу жолын оқу әрекеті жасалмас бұрын, мәтінді бірден стандартты шығысқа жазады.

b «:» функциясын арнайы белгімен тармақтайды. Белгі көрсетілмесе, тармақ сценарийдің соңында орын алады.

мәтін Үлгіні жояды. 0 немесе 1 мекенжайдан немесе 2 мекенжай ауқымынан мәтін стандартты шығысқа басып шығарылады.

d Үлгіні жояды және жаңа циклды бастайды.

D Бірінші жаңа жол таңбасындағы үлгінің бастапқы сегментін жояды және жаңа циклды бастайды.

g Үлгінің мазмұнын ұстау кеңістігінің мазмұнымен ауыстырады.

G Жаңа жолды одан кейін ұстау кеңістігінің мазмұнын қосады.

h Ұстау кеңістігінің мазмұнын үлгі мазмұнымен ауыстырады.

H Үлгі мазмұнынан кейін жаңа жолды қосады

i ext Мәтінді стандартты шығысқа жазу.

l (el әрпі). Үлгіні стандартты шығысқа көрнекі түрде бір мәнді түрде жазады. Бұл пішін келесідей:

кері қиғаш сызық \

вагон қайтару

кестелеу

тік қойынды v

Басып шығарылмайтын таңбалар таңбадағы әрбір байт үшін үш таңбалы сегіздік сандар (алдыңғы кері қиғаш сызықпен) түрінде жазылады (ең маңызды байт бірінші).

Ұзын жолдар кері қиғаш сызықтан кейін жаңа жол таңбасымен оралады. Әрбір жолдың соңы «$» белгісімен белгіленеді.

n Әдепкі шығыс қайта анықталмаған болса, үлгіні стандартты шығысқа жазады және үлгіні келесі кіріс жолымен ауыстырады.

N Қосылған материалды бастапқы мазмұннан бөлу үшін енгізілген жаңа жол таңбасын пайдаланып үлгіге келесі жолды қосады.

p Стандартты шығысқа үлгіні жазады.

P Үлгіні стандартты шығысқа бірінші жаңа жол таңбасына дейін жазады.

q Сценарийдің соңын айырады және жаңа циклды жүктеместен шығады.

r файлы Жолды оқудың келесі әрекеті орындалмас бұрын файлдың мазмұнын бірден стандартты шығысқа көшіреді. Егер қандай да бір себептермен файлды оқу мүмкін болмаса, ол үнсіз еленбейді және қате шарты орнатылмайды.

s/тұрақты өрнек/алмастыру/жалаушалар

Ауыстырылған жолды үлгідегі бірінші тұрақты өрнекпен ауыстырады. Кері қиғаш сызық немесе жаңа жолдан басқа кез келген таңба тұрақты өрнек пен ауыстыруды бөлу үшін кері қиғаш сызықтың орнына немесе қиғаш сызықтың орнына жаңа жолды пайдалануға болады. Тұрақты өрнек пен ауыстыру ішінде, егер оның алдында кері қиғаш сызық болса, тұрақты өрнек бөлгішінің өзі таңба ретінде пайдаланылуы мүмкін.

Ауыстыру жолы тұрақты өрнекке сәйкес келсе, ауыстыруда амперсанд («&») пайда болады. Бұл контексттегі «&» ерекше мағынасы амперсанды кері қиғаш сызықпен префикспен өзгертуге болады. «#» жолы, мұндағы «#» цифр болып табылады, ол кері өрнектің берілуіне сәйкес мәтінмен ауыстырылады.

Жолды оған жаңа жол таңбасын қосу арқылы бөлуге болады. Ауыстыру жолындағы жаңа жол таңбасын анықтау үшін оның алдына кері қиғаш сызық қойыңыз.

Ауыстырылған функциядағы жалаушалардың мәні нөлге тең немесе төмендегілердің бірі:

N Үлгідегі тұрақты өрнектің тек N' қайталануы үшін ауыстыруды жасаңыз.

g Біріншісі ғана емес, барлық қабаттаспайтын тұрақты өрнек сәйкестіктері үшін ауыстыруды жасаңыз.

p Ауыстыру орындалса, үлгіні стандартты шығысқа жазыңыз. Ауыстырылған жол ауыстырылатын жолға сәйкес келсе, ол бәрібір ауыстыру ретінде қарастырылады.

w Ауыстыру орын алса, үлгіні файлға қосады. Ауыстырылған жол ауыстырылатын жолға сәйкес келсе, ол бәрібір ауыстыру ретінде қарастырылады.

Функция тармағының «:» белгісі, егер енгізу жолы қайта оқылғаннан кейін немесе «t» функциясы іске қосылғаннан кейін қандай да бір ауыстыру жасалса. Егер белгі анықталмаса, тармақ сценарийдің соңына өтеді.

w файлы Файлға үлгі қосады.

x Үлгі мазмұнын өзгертеді және бос орындарды ұстайды.

y/string1/string2/

Үлгідегі 1-жолдағы таңбаның барлық қайталануларын 2-жолдағы сәйкес таңбалармен ауыстырады. Жолдарды бөлу үшін кері қиғаш сызық немесе жаңа жолдың орнына кері қиғаш сызық немесе жаңа жолдан басқа кез келген таңба пайдаланылуы мүмкін. Жол1 және жол2 ішінде кері қиғаш сызық жаңа жол таңбасынан басқа кез келген таңбамен жалғасады, ол литерал болып табылады және кері қиғаш сызықтан кейін «n» жаңа жол таңбасымен ауыстырылады.

функциясы

Функциялар тізімі

Функцияны немесе функциялар тізімін мекенжай бойынша таңдалмаған жолдарға ғана қолданады.

Бұл функция ештеңе жасамайды, ол «b» және «t» пәрмендері тармақталуы мүмкін белгіні шақырады.

Стандартты шығысқа жол нөмірін, одан кейін жаңа жол таңбасын жазады.

Бос жолдарды елемейді.

"#" және жолдың қалған бөлігі еленбейді (түсініктеме ретінде қарастырылады), егер файлдағы алғашқы екі таңба "#n" болса, әдепкі шығыс басылады. Пәрмен жолында -n опциясын көрсетумен бірдей.

Қоршаған орта

COLUMNS, LANG, LC_ALL, LC_CTYPE және LC_COLLATE айнымалылары environ(7) бөлімінде сипатталғандай sed іске қосылуына жол бермейді.

Шығу күйі

sed шығу сәтті болса, 0 параметрімен және бар болса >0 параметрімен шығады

Сондай-ақ қараңыз

awk(1), ed(1), grep(1), regex(3), re_format(7)

Стандартты

sed утилитасы EEE Std 1003.2 («POSIX.2») спецификациялар жинағында болады деп күтілуде

-E, -a және -i опциялары FreeBSD кеңейтімдерінде стандартты емес және басқа операциялық жүйелерде қол жетімді болмауы мүмкін.

L. E. McMahon жазған sed командасы AT&T UNIX 7 нұсқасында пайда болды.

0x5C (ASCII `\') мәні бар көпбайтты таңбаларды тануға болады

'a', 'c' және 'i' пәрмен аргументтеріндегі жол таңбаларының жалғасы ретінде дұрыс емес

Көпбайттық таңбаларды пәрмендермен бөлгіштер ретінде пайдалану мүмкін емес

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
Рақмет сізге. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!