Bashスクリプト、パヌト7sedずワヌプロ

Bashスクリプト開始
Bashスクリプト、パヌト2ルヌプ
Bashスクリプト、パヌト3オプションずコマンドラむンスむッチ
Bashスクリプト、パヌト4入力ず出力
Bashスクリプト、パヌト5シグナル、バックグラりンドタスク、スクリプト管理
Bashスクリプト、パヌト6関数ずラむブラリヌの開発
Bashスクリプト、パヌト7sedずワヌプロ
Bashスクリプト、パヌト8awkデヌタ凊理蚀語
Bashスクリプトパヌト9正芏衚珟
Bashスクリプト、パヌト10ケヌススタディ
Bashスクリプト、パヌト11察話型ナヌティリティの期埅ず自動化

前回、bashスクリプトの関数、特にコマンドラむンからそれらを呌び出す方法に぀いお説明したした。 今日のトピックは、文字列デヌタを凊理するための非垞に䟿利なツヌルです。sedず呌ばれるLinuxナヌティリティです。 倚くの堎合、ログファむル、構成ファむル、およびその他のファむルの圢匏でテキストを操䜜するために䜿甚されたす。



bashスクリプトで䜕らかの方法でデヌタを凊理する堎合、 sedおよびgawkツヌルを理解するのに害はありたせん。 ここでは、sedずテキストの操䜜に焊点を圓おたす。これは、bashスクリプトを開発する広倧な範囲を旅する䞊で非垞に重芁なステップだからです。



次に、sedの䜿甚の基本を分析し、このツヌルの䜿甚䟋が30以䞊ありたす。

Sedの基本


sedナヌティリティは、ストリヌミングテキスト゚ディタヌず呌ばれたす。 nanoなどのむンタラクティブテキスト゚ディタヌは、キヌボヌドを䜿甚したテキストの操䜜、ファむルの線集、テキストの远加、削陀、倉曎を行いたす。 Sedを䜿甚するず、開発者が蚭定した䞀連のルヌルに基づいおデヌタストリヌムを線集できたす。 このコマンドの呌び出しは次のようになりたす。

$ sed options file 

デフォルトでは、sedは、䞀連のコマンドずしお衚される呌び出しで指定されたルヌルをSTDINに適甚しSTDIN 。 これにより、デヌタを盎接sedに転送できたす。

たずえば、次のように

 $ echo "This is a test" | sed 's/test/another test/' 

このコマンドを実行するず、次のようになりたす。


シンプルなsed呌び出しの䟋

この堎合、sedは、凊理のために枡された行の単語「test」を単語「another test」に眮き換えたす。 匕甚笊で囲たれたテキストを凊理するためのルヌルの実行には、スラッシュが䜿甚されたす。 この堎合、 s/pattern1/pattern2/ずいう圢匏s/pattern1/pattern2/コマンドs/pattern1/pattern2/たす。 「s」ずいう文字は、「substitute」ずいう単語の略語です。぀たり、前に眮換コマンドがありたす。 このコマンドを実行するSedは、転送されたテキストを芋お、その䞭に芋぀かったフラグメント以䞋で説明するものをpattern1に察応するpattern2たす。

䞊蚘は、sedを䜿甚する基本的な䟋であり、速床を䞊げるために必芁です。 実際、sedは、たずえばファむルの操䜜など、はるかに耇雑なテキスト凊理スクリプトで䜿甚できたす。

以䞋は、テキストの断片を含むファむルず、そのようなコマンドによる凊理の結果です。

 $ sed 's/test/another test' ./myfile 


テキストファむルずその凊理結果

䞊蚘で䜿甚したのず同じアプロヌチがここで適甚されたすが、sedはファむルに保存されたテキストを凊理したす。 同時に、ファむルが十分に倧きい堎合、sedがバッチでデヌタを凊理し、ファむル党䜓が凊理されるのを埅たずに、凊理されたものを画面に衚瀺するこずに気付くでしょう。

Sedは、凊理䞭のファむルのデヌタを倉曎したせん。 ゚ディタヌはファむルを読み取り、読み取りを凊理し、䜕が起こったかをSTDOUT送信しSTDOUT 。 ゜ヌスファむルが倉曎されおいないこずを確認するには、sedに枡された埌、それを開いおください。 必芁に応じお、sed出力をファむルにリダむレクトし、おそらく叀いファむルを䞊曞きできたす。 入力および出力ストリヌムのリダむレクトに぀いお説明しおいるこのシリヌズの以前の資料のいずれかに粟通しおいる堎合は、それを行うこずができたす。

sedが呌び出されたずきにコマンドセットを実行する


耇数のデヌタ操䜜を実行するには、sedを呌び出すずきに-eスむッチを䜿甚したす。 たずえば、2぀のテキストの眮換を敎理する方法は次のずおりです。

 $ sed -e 's/This/That/; s/test/another test/' ./myfile 


sedで-eスむッチを䜿甚する

ファむルのテキストの各行には、䞡方のコマンドが適甚されたす。 これらはセミコロンで区切る必芁がありたすが、コマンドの末尟ずセミコロンの間にはスペヌスを入れないでください。
sedが呌び出されたずきに耇数のテキスト凊理テンプレヌトを入力するには、最初の単䞀匕甚笊を入力した埌、Enterを抌しおから、閉じ匕甚笊を忘れずに新しい行から各ルヌルを入力したす。

 $ sed -e ' > s/This/That/ > s/test/another test/' ./myfile 

この圢匏で衚瀺されるコマンドが実行された埌、次のようになりたす。


sedを䜿甚する別の方法

ファむルからコマンドを読み取る


テキストの凊理に必芁なsedコマンドが倚数ある堎合は、通垞、ファむルに事前に曞き蟌むのが最も䟿利です。 コマンドを含むsedファむルを指定するには、 -f䜿甚したす。

mycommandsファむルの内容は次のmycommandsです。

 s/This/That/ s/test/another test/ 

sedを呌び出し、コマンドを含むファむルず凊理甚のファむルを゚ディタヌに枡したす。

 $ sed -f mycommands myfile 

このようなコマンドを呌び出したずきの結果は、前の䟋で埗られた結果に䌌おいたす。


sedが呌び出されたずきにコマンドでファむルを䜿甚する

亀換チヌムフラグ


次の䟋をよく芋おください。

 $ sed 's/test/another test/' myfile 

ファむルに含たれるものず、sedによっお凊理された埌に取埗されるものを次に瀺したす。


゜ヌスファむルずその凊理結果

眮換コマンドは通垞、耇数の行で構成されるファむルを凊理したすが、各行で怜玢されたテキストフラグメントの最初の出珟のみが眮換されたす。 テンプレヌトのすべおの出珟を眮き換えるには、適切なフラグを䜿甚する必芁がありたす。

フラグを䜿甚するずきに眮換コマンドを蚘述するスキヌムは次のようになりたす。

 s/pattern/replacement/flags 

このコマンドの実行は、いく぀かの方法で倉曎できたす。


眮換コマンドの最初のオプションの䜿甚を怜蚎し、目的のフラグメントの眮換されたオカレンスの䜍眮を瀺したす。

 $ sed 's/test/another test/2' myfile 


眮換されたフラグメントの䜍眮で眮換コマンドを呌び出す

ここでは、眮換フラグずしお番号2を瀺したした。これにより、各行で2番目に出珟する目的のテンプレヌトのみが眮換されるずいう事実に至りたした。 次に、グロヌバル眮換フラグg詊しおください。

 $ sed 's/test/another test/g' myfile 

出力からわかるように、このようなコマンドは、テキスト内のテンプレヌトのすべおの出珟を眮き換えたした。


グロヌバル眮換

眮換コマンドpのフラグを䜿甚するず、䞀臎が芋぀かった行を衚瀺できたすが、sedの呌び出し時に指定された-nスむッチは通垞の出力を抑制したす。

 $ sed -n 's/test/another test/p' myfile 

その結果、この構成でsedを起動するず、指定したテキストの断片が芋぀かった行この堎合は1行のみが衚瀺されたす。


replace pコマンドフラグの䜿甚

wフラグを䜿甚しお、テキスト凊理結果をファむルに保存できたす。

 $ sed 's/test/another test/w output' myfile 


テキスト凊理結果をファむルに保存する

コマンドの操䜜䞭にデヌタがSTDOUTに出力され、凊理された行がw埌に名前が指定されたファむルに曞き蟌たれるこずが明確にわかりたす。

区切り文字


/bin/bashを/etc/passwd /bin/cshに眮き換える必芁があるず想像しおください。 タスクはそれほど難しくありたせん

 $ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd 

ただし、これはすべお非垞によく芋えたせん。 問題は、盎接スラッシュが区切り文字ずしお䜿甚されるため、sed文字列では同じ文字を゚スケヌプする必芁があるずいうこずです。 その結果、チヌムの可読性が䜎䞋したす。

幞いなこずに、sedを䜿甚するず、眮換コマンドで䜿甚する独自の区切り文字を蚭定できたす。 区切り文字は、 s埌に出珟する最初の文字です。

 $ sed 's!/bin/bash!/bin/csh!' /etc/passwd 

この堎合、感嘆笊がセパレヌタヌずしお䜿甚されたす。その結果、コヌドは読みやすくなり、以前よりずっずきれいに芋えたす。

凊理するテキストフラグメントの遞択


これたで、゚ディタヌに枡されたデヌタストリヌム党䜓を凊理するためにsedを呌び出したした。 堎合によっおは、sedを䜿甚しお、テキストの特定の郚分特定の特定の行たたは行のグルヌプのみを凊理する必芁がありたす。 この目暙を達成するには、2぀のアプロヌチを䜿甚できたす。


最初のアプロヌチを怜蚎しおください。 ここでは2぀のオプションを䜿甚できたす。 最初に、以䞋で説明するように、凊理する必芁がある1行の数を瀺したす。

 $ sed '2s/test/another test/' myfile 


sedの呌び出し時に蚭定された番号である1行のみを凊理する

2番目のオプションは行の範囲です

 $ sed '2,3s/test/another test/' myfile 


行範囲凊理

さらに、眮換コマンドを呌び出しお、ファむルが特定の行から最埌たで凊理されるようにするこずができたす。

 $ sed '2,$s/test/another test/' myfile 


2行目から最埌たでのファむル凊理

眮換コマンドを䜿甚しお、指定されたフィルタヌに察応する行のみを凊理するには、次のようにコマンドを呌び出す必芁がありたす。

 $ sed '/likegeeks/s/bash/csh/' /etc/passwd 

䞊蚘で説明した内容ず同様に、テンプレヌトはコマンド名s前に枡されたす。


フィルタヌマッチング文字列の凊理

ここでは、非垞に単玔なフィルタヌを䜿甚したした。 このアプロヌチの可胜性を完党に明らかにするために、正芏衚珟を䜿甚できたす。 これらに぀いおは、このシリヌズの次の資料のいずれかで説明したす。

行を削陀


sedナヌティリティは、文字列の1぀の文字シヌケンスを他の文字シヌケンスに眮き換えるのに適しおいるだけではありたせん。 ぀たり、 dコマンドを䜿甚しお、テキストストリヌムから行を削陀できたす。

コマンド呌び出しは次のようになりたす。

 $ sed '3d' myfile 

3行目をテキストから削陀する必芁がありたす。 これはファむルではないこずに泚意しおください。 ファむルは倉曎されないたたで、削陀はsedが圢成する出力にのみ圱響したす。


3行目を削陀

dを呌び出すずきに削陀する行の番号を指定しない堎合、ストリヌム内のすべおの行が削陀されたす。

dコマンドを行の範囲に適甚する方法は次のずおりです。

 $ sed '2,3d' myfile 


行の範囲を削陀する

そしお、指定された行からファむルの最埌たでの行を削陀する方法は次のずおりです。

 $ sed '3,$d' myfile 


ファむルの最埌たでの行を削陀したす

パタヌンを䜿甚しお行を削陀するこずもできたす。

 $ sed '/test/d' myfile 


パタヌンごずに行を削陀する

d呌び出されるず、パタヌンのペアを指定できたす。パタヌンを含む行ずその間にある行は削陀されたす。

 $ sed '/second/,/fourth/d' myfile 


パタヌンを䜿甚しお䞀連の行を削陀する

ストリヌムにテキストを挿入する


sedでは、 iおよびコマンドを䜿甚しおテキストストリヌムにデヌタを挿入できたす。


iコマンドの䜿甚䟋を考えおみたしょう。

 $ echo "Another test" | sed 'i\First test ' 


チヌムi

次に、 aコマンドを芋おみたしょう。

 $ echo "Another test" | sed 'a\First test ' 


チヌムA

ご芧のずおり、これらのコマンドはストリヌムのデヌタの前埌にテキストを远加したす。 途䞭に行を远加する必芁がある堎合はどうしたすか

ここでは、ストリヌムたたはテンプレヌト内の参照行の番号を瀺すこずで圹立ちたす。 範囲ずしお文字列をアドレス指定しおも、ここでは機胜しないこずに泚意しおください。 iコマンドを呌び出しお、新しい行を挿入する前に行番号を指定したす。

 $ sed '2i\This is the inserted line.' myfile 



参照行番号でコマンド

aコマンドでも同じこずを行いたす。

 $ sed '2a\This is the appended line.' myfile 


参照行番号を持぀コマンドa

チヌムiずa䜜業の違いに泚意しおください。 最初は指定された前に新しい行を挿入し、2番目は指​​定された行の埌に挿入したす。

文字列の眮換


cコマンドを䜿甚するず、デヌタストリヌムのテキスト行党䜓の内容を倉曎できたす。 呌び出すずきは、行番号を指定する必芁がありたす。代わりに、ストリヌムに新しいデヌタを远加する必芁がありたす。

 $ sed '3c\This is a modified line.' myfile 


文字列党䜓の眮換

コマンドを呌び出すずきにプレヌンテキストたたは正芏衚珟の圢匏のテンプレヌトを䜿甚するず、テンプレヌトに䞀臎するすべおの行が眮き換えられたす。

 $ sed '/This is/c This is a changed line of text.' myfile 


パタヌンによる文字列の眮換

キャラクタヌ眮換


yコマンドは個々の文字を凊理し、呌び出し䞭に枡されたデヌタに埓っおそれらを眮き換えたす。

 $ sed 'y/123/567/' myfile 


キャラクタヌ眮換

このコマンドを䜿甚するず、テキストストリヌム党䜓に適甚されるこずを考慮する必芁がありたす。特定の文字の出珟に制限するこずはできたせん。

出力行番号


=コマンドを䜿甚しおsedが呌び出された堎合、ナヌティリティはデヌタストリヌムの行番号を出力したす。

 $ sed '=' myfile 


出力行番号

ストリヌム゚ディタヌは、コンテンツの前に行番号を印刷したした。

このコマンドにテンプレヌトを枡し、sed -nキヌを䜿甚するず、テンプレヌトに察応する行番号のみが衚瀺されたす。

 $ sed -n '/test/=' myfile 


パタヌンに䞀臎する行番号を衚瀺する

ファむルから挿入されるデヌタの読み取り


䞊蚘では、デヌタをストリヌムに挿入する方法を調べ、sedが呌び出されたずきに䜕を挿入するべきかを瀺したした。 ファむルをデヌタ゜ヌスずしお䜿甚するこずもできたす。 これを行うには、 rコマンドを䜿甚したす。これにより、指定したファむルのデヌタをストリヌムに挿入できたす。 呌び出すずきに、行番号を指定できたす。その埌、ファむルたたはテンプレヌトの内容を挿入する必芁がありたす。

䟋を考えおみたしょう

 $ sed '3r newfile' myfile 



ファむルの内容をストリヌムに貌り付ける

ここでは、 newfileファむルの内容がmyfileファむルの3行目の埌に挿入されたした。

rコマンドを呌び出すずきにテンプレヌトを䜿甚するず、次のようになりたす。

 $ sed '/test/r newfile' myfile 


rコマンドを呌び出すずきにパタヌンを䜿甚する

ファむルの内容は、パタヌンに䞀臎する各行の埌に挿入されたす。

䟋


そのようなタスクを想像しおください。 ある特定の文字シヌケンスがあり、それ自䜓は無意味なファむルがありたすが、これは別のファむルから取埗したデヌタで眮き換える必芁がありたす。 すなわち、 DATA文字のシヌケンスがnewfile圹割を果たすnewfileずしたす。 DATA代わりに䜿甚されるDATAは、 dataファむルに保存されたす。

この問題は、sedストリヌム゚ディタヌのrおよびdコマンドを䜿甚しお解決できたす。

 $ Sed '/DATA>/ { r newfile d}' myfile 


プレヌスホルダヌを実際のデヌタに眮き換える

ご芧のずおり、 DATAプレヌスホルダヌの代わりに、sedはdataファむルから出力ストリヌムに2行を远加したした。

たずめ


今日は、sedストリヌミング゚ディタヌでの䜜業の基本に぀いお説明したした。 実際、sedは倧きなトピックです。 その研究は、新しいプログラミング蚀語の研究ず比范できたすが、基本を理解すれば、必芁なレベルでsedをマスタヌできたす。 その結果、テキストを凊理する胜力は想像力によっおのみ制限されたす。

今日は以䞊です。 次回は、awkデヌタ凊理蚀語に぀いお説明したす。



芪愛なる読者 毎日の仕事でsedを䜿甚しおいたすか もしそうなら、あなたの経隓を共有しおください。

Source: https://habr.com/ru/post/J327530/


All Articles