Linux学習用のsed置換コマンドの説明

cat /etc/redhat-releaseオペレーティング システムが であることがわかりCentOS Linux release 7.6.1810uname -rカーネルのバージョンが であることがわかり3.10.0-957.el7.x86_64バージョンが であることがsed --versionわかりますsed4.2.2
ここに画像の説明を挿入

sed(sed strem editor) は行エディタとして理解できますが、テキスト ファイル自体を直接編集するわけではなく、デフォルトでは元のファイルの内容に変更を加えません。sedファイルを処理する際、ファイルの内容を 1 行ずつメモリに読み込み、読み込んだファイルの内容を特定のパターンで処理する、このようなメモリ空間の一部がパターン空間となります。
sedの 2 つの処理方法:

テキストの内容をすべてパターン空間に 1 行ずつ読み込むと、パターン空間に指定されたパターンがあり、読み取った行とパターン空間のパターンが一致します。パターン条件は1行ずつ
パターンスペースに読み込まれ、パターンフィルタリング条件を満たすものはパターンスペースで編集してパターンスペースの内容を表示・出力し、一致しないものは処理せずに出力します彼らはあるとして。

sed次の 2 つの形式があります。

sed [オプション]… 'コマンド' [ファイル]…
sed [オプション] -f スクリプトファイル [ファイル]…

sed置換コマンドは ですs。一般的な形式は次のとおりです。

sed 's/oldstring/newstring/' filename、これにより、パターン空間内の最初の一致が にoldstring変更されますnewstringが、これはfilename元のファイルでは機能しません。

sed -e 's/oldstring1/newstring1/' -e 's/oldstring2/newstring2/' filename、これにより、パターン空間の最初の一致が にoldstring1変更されnewstring1、次に変更された文字列で最初の一致が に変更されますoldstring2newstring2同様に、これはfilename元のファイルでは機能しません。

sed -i 's/oldstring1/newstring1/' filenameこれにより、パターン空間で最初に一致したものが にoldstring1変更されnewstring1、変更された内容が元のファイルに出力されますfilename

正規表現を使用できる形式は以下のとおりです。

`sed 's/regex/newstring/' ファイル名

`sed -r 's/拡張正規表現/newstring/' ファイル名

sed 's/oldstring/newstring/' ファイル名

echo a:aa:aaa >> sedtest.txt
echo a:bb:aa >> sedtest.txt
echo cc : cc : ccc >> sedtest.txt

上記の 3 つのコマンドは、以下の内容を書き込みますsedtest.txt

a:aa:aaa
a:bb:aa
cc : cc : ccc

ここに画像の説明を挿入

sed 's/a/aa/' sedtest.txta、それぞれの最初のものが置き換えられていることがわかりaa、それを使用して、内部のコンテンツが変更されていないcat sedtest.txtことを確認します。sedtest.txt
ここに画像の説明を挿入

echo 'go/d' >> sedtest.txtgo/d書き込むsedtest.txtと、次の内容がcat sedtest.txt表示されます。sedtest.txt

a:aa:aaa
a:bb:aa
cc : cc : ccc
go/d

/に変更したい場合は、oそれを使用したい場合はsed 's///o/' sedtest.txtエラーが報告されます。

sed: -e expression #1, char 5: unknown option to \`s'

ここに画像の説明を挿入

2 つの方法があり、最初の方法ではエスケープ文字を使用しますsed 's/\//o/' sedtest.txtの内容が変更されていないcat sedtest.txtことがわかります。sedtest.txt
ここに画像の説明を挿入

2 つ目は区切り文字を変更することです。区切り文字を に変更すると!の内容が変わっていないことがわかります。sed 's!/!o!' sedtest.txtcat sedtest.txtsedtest.txt
ここに画像の説明を挿入

#区切り文字は、@これらの文字、、、sed 's#/#o#' sedtest.txt変更することもできますsed 's@/@o@' sedtest.txt
ここに画像の説明を挿入

sed -e オプション

echo '::' >> sedtest.txt::書くsedtest.txtcat sedtest.txt以下のように内容が表示されます。

a:aa:aaa
a:bb:aa
cc : cc : ccc
go/d
::

ここに画像の説明を挿入

sed -e 's/aa/z:/' -e 's/::/oo:/' sedtest.txt | cat -n最初にaaに置き換えてから、z:前の手順で置き換えた内容に基づいて再度 に::置き換えますoo:。1 行目はaaに置き換えられzoo、2 行目は にaaのみ置き換えられz:、 は に置き換えられていることがわかります。 5行目の は::に変更されておりoo:|はパイプ記号です。これは、前の出力を次のコマンドの入力記号として使用し、cat -nその内容を行番号とともに出力することを意味します。の内容は変わっていないことがcat sedtest.txtわかります。sedtest.txt
ここに画像の説明を挿入

sed 's/aa/z:/;s/::/oo:/' sedtest.txt | cat -n-e2 つのオプションを削除し、コマンドを分離して;上記の効果を実現します。の内容は変わっていないことがcat -n sedtest.txtわかります。sedtest.txt
ここに画像の説明を挿入

sed -i オプション

sed -i 's/oldstring1/newstring1/' filename、これにより、パターン空間内の最初の一致がoldstring1に変更されnewstring1、変更された結果がfilenameファイルに書き込まれます。
cat -n sedtest.txt次のことがわかります。

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  go/d
     5  ::

先頭の1、、、、およびは行番号であり、内部の内容ではありませ2これを に変更し変更した内容をそこに書き込むと変更後は次の内容が表示されます。345sedtest.txt
sed -i 's/\//o/' sedtest.txt/osedtest.txtcat -n sedtest.txt

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  good
     5  ::

ファイルが/変更されていることが判明しましたo
ここに画像の説明を挿入

sed の定期サポート

.改行を除く任意の文字、1 文字のみと一致します。

sed 's/.:/love:/' sedtest.txt最初のグループの任意字符+:の文字列を に置き換えるlove:と、の内容が変わっていないことcat -n sedtest.txtがわかります。sedtest.txt
ここに画像の説明を挿入

*文字またはその前の正規表現と 0 回から数回一致します。

sed 's/c* /c/' sedtest.txt | cat -ncc 、が置き換えられたことがわかりcの内容は変更されていないcat -n sedtest.txtことがわかります。sedtest.txt
ここに画像の説明を挿入

^行の先頭と一致します

echo ca:r >> sedtest.txtca:rファイルの最後の行に書き込むsedtest.txtと、cat -n sedtest.txt変更後に次の内容が表示されます。

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  good
     5  ::
     6  ca:r

ここに画像の説明を挿入

sed 's/a:/d:/' sedtest.txt | cat -n6 行目はa:変更されますd:が、sed 's/^a:/d:/' sedtest.txt | cat -n6 行目は変更されませんa:
ここに画像の説明を挿入

sed -r 拡張メタキャラクター

+ は前の文字と 1 回以上一致します

echo 'a' >> sedfiletest.txt
echo 'aa' >> sedfiletest.txt
echo 'aaa' >> sedfiletest.txt
echo 'ab' >> sedfiletest.txt
echo 'aab' >> sedfiletest.txt
echo 'aaabbb' >> sedfiletest.txt

次の内容を入力します。

a
aa
aaa
ab
aab
aaabbb

そこに書き込むsedfiletest.txtcat sedfiletest.txt中を覗いてみましょうsedfiletest.txtおよび と
ここに画像の説明を挿入
sed -r 's/a+b/:/' sedfiletest.txt一致しますabaabaaabaaa......b
ここに画像の説明を挿入

echo 'b' >> sedfiletest.txt、そこbに書き込みますsedfiletest.txtcat sedfiletest.txt中を覗いてみましょうsedfiletest.txt
ここに画像の説明を挿入

sed -r 's/a?b/:/' sedfiletest.txt?文字の0時刻または1その前の時刻にのみ一致し、他の時刻には一致しません。
ここに画像の説明を挿入

sed -r 's/a|b/:/' sedfiletest.txt | cat -n|同等またはファイルの内容が変更されていないことが判明したことを意味しますabcat -n sedfiletest.txt
ここに画像の説明を挿入

sed -r 's/(aa)|(b)/:/' sedfiletest.txt | cat -n()同等またはファイルの内容が変更されていないことが判明したことを意味します组合コールバックにも使用できます。つまり、変数として一時的に使用できます。ここでの同等物はと同等ですaabcat -n sedfiletest.txt
ここに画像の説明を挿入
()sed -r 's/(aa)|(b)/\1:\2/g' sedfiletest.txt | cat -n\1aa\2b
ここに画像の説明を挿入

find / -name passwd

この記事は8月の7日目の学習ノートで、内容はGeek Timeの「Linux実践スキル100講座」から引用しています。

おすすめ

転載: blog.csdn.net/qq_42108074/article/details/131885898