cat /etc/redhat-release
オペレーティング システムが であることがわかりCentOS Linux release 7.6.1810
、uname -r
カーネルのバージョンが であることがわかり3.10.0-957.el7.x86_64
、バージョンが であることがsed --version
わかります。sed
4.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
、次に変更された文字列で最初の一致が に変更されますoldstring2
。newstring2
同様に、これは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.txt
a
、それぞれの最初のものが置き換えられていることがわかりaa
、それを使用して、内部のコンテンツが変更されていないcat sedtest.txt
ことを確認します。sedtest.txt
echo 'go/d' >> sedtest.txt
go/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.txt
cat sedtest.txt
sedtest.txt
#
区切り文字は、@
これらの文字、、、sed 's#/#o#' sedtest.txt
に変更することもできますsed 's@/@o@' sedtest.txt
。
sed -e オプション
echo '::' >> sedtest.txt
::
に書くsedtest.txt
とcat 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
、-e
2 つのオプションを削除し、コマンドを分離して;
上記の効果を実現します。の内容は変わっていないことが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
。これを に変更し、変更した内容をそこに書き込むと、変更後は次の内容が表示されます。3
4
5
sedtest.txt
sed -i 's/\//o/' sedtest.txt
/
o
sedtest.txt
cat -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 -n
cc
、が置き換えられたことがわかりc
、の内容は変更されていないcat -n sedtest.txt
ことがわかります。sedtest.txt
^
行の先頭と一致します
echo ca:r >> sedtest.txt
ca: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 -n
6 行目はa:
変更されますd:
が、sed 's/^a:/d:/' sedtest.txt | cat -n
6 行目は変更されません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.txt
。cat sedfiletest.txt
中を覗いてみましょうsedfiletest.txt
。、、および と
sed -r 's/a+b/:/' sedfiletest.txt
一致します。ab
aab
aaab
aaa......b
echo 'b' >> sedfiletest.txt
、そこb
に書き込みますsedfiletest.txt
。cat sedfiletest.txt
中を覗いてみましょうsedfiletest.txt
。
sed -r 's/a?b/:/' sedfiletest.txt
、?
文字の0
時刻または1
その前の時刻にのみ一致し、他の時刻には一致しません。
sed -r 's/a|b/:/' sedfiletest.txt | cat -n
と|
同等、またはファイルの内容が変更されていないことが判明したことを意味します或
。a
b
cat -n sedfiletest.txt
sed -r 's/(aa)|(b)/:/' sedfiletest.txt | cat -n
と()
同等、またはファイルの内容が変更されていないことが判明したことを意味します组合
。コールバックにも使用できます。つまり、変数として一時的に使用できます。ここでの同等物はと同等です。aa
b
cat -n sedfiletest.txt
()
sed -r 's/(aa)|(b)/\1:\2/g' sedfiletest.txt | cat -n
\1
aa
\2
b
find / -name passwd
この記事は8月の7日目の学習ノートで、内容はGeek Timeの「Linux実践スキル100講座」から引用しています。