Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

高度な Sed 置換:専門家のテクニックと実践例

高度な Sed 置換:専門家のテクニックと実践例 この記事は、現在進行中の Unix Sed のヒントとテクニック シリーズの一部です。

前回の sed 記事では、sed 印刷、sed 削除、sed 代替、sed ファイル書き込み、sed 複数コマンドについて学びました。

この記事では、sed の「s」置換コマンドを使用した興味深い回避策をいくつかの実践的な例とともに確認してみましょう。

私。 Sed 置換デリミタ

前回の投稿で説明したように、@ % | などのさまざまな区切り文字を使用できます。; :sed 代替コマンド内。

まず、以下で説明するすべての例で使用される path.txt ファイルを作成しましょう。

$ cat path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

例 1 – sed @ 区切り文字:/opt/omni/lbin を /opt/tools/bin に置き換えます

「/」を含むパス名を置き換える場合は、「/」の代わりに @ を区切り文字として使用できます。以下の sed の例では、入力ファイルの最後の行で、/opt/omni/lbin が /opt/tools/bin に変更されました。

$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin:/opt/omni/sbin:/root/bin

例 2 – sed / 区切り文字:/opt/omni/lbin を /opt/tools/bin に置き換えます

パス名関連の置換で「/」を使用する必要がある場合は、以下に示すように置換データ内の「/」をエスケープする必要があります。この sed の例では、区切り文字「/」が REGEXP および REPLACEMENT 部分でエスケープされています。

$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin:/opt/omni/sbin:/root/bin

II. Sed ‘&’ 一致した文字列を取得

正規表現が一致する入力行の正確な部分は &で表され、置換部分で使用できます。

例 1 – sed と使用法:/usr/bin/ を /usr/bin/local に置き換えます

$ sed 's@/usr/bin@&/local@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

上記の例では、置換部分の「&」をパターンに一致した/usr/binに置換し、/localで追加します。したがって、出力では、/usr/bin がすべて /usr/bin/local に置き換えられます。

例 2 – sed と使用法:行全体と一致する

&は、指定された REGEXP に一致するものを置き換えます。

$ sed 's@^.*$@<<<&>>>@g' path.txt
<<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>>
<<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>>
<<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>

上記の例では、正規表現には「^.*$」が含まれており、行全体と一致します。置換部分 <<<&>>> は、行頭と行末にそれぞれ <<<と>>> を入れて行全体を書き込みます。

III. Sed でのグループ化と後方参照

グループ化は、通常の正規表現と同様に sed で使用できます。グループは「\(」で開き、「\)」で閉じます。グループ化は、逆参照と組み合わせて使用できます。

逆参照とは、グループ化によって選択された正規表現の一部を再利用することです。 sed の後方参照は、正規表現と置換コマンドの置換部分の両方で使用できます。

例 1:各行の最初のパスのみを取得する

$ sed 's/\(\/[^:]*\).*/\1/g' path.txt
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin

上の例では、 \(\/[^:]*\) は、最初の :が来る前に利用可能なパスと一致します。 \1 は、最初に一致したグループを置き換えます。

例 2:マルチグループ化

ファイル path.txt で、ファイルの最終行のフィールドの順序を変更します。

$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin:
/root/bin:/opt/omni/sbin:/opt/omni/lbin

上記のコマンドでは、$ は最後の行に対してのみ置換が行われるように指定しています。出力には、最後の行のパス値の順序が逆になっていることが示されています。

例 3:/etc/passwd ファイル内のユーザー名のリストを取得する

この sed の例では、/etc/passwd ファイルの最初のフィールドのみが表示されます。

$sed 's/\([^:]*\).*/\1/' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

例 4:各単語の最初の文字を括弧で囲みます

この sed の例では、括弧内のすべての単語の最初の文字を出力します。

$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff

例 5:単純な数値を入力します。

数値のリストを含むnumbersというファイルを作成しましょう。以下の sed コマンドの例は、数千までの数値を伝達するために使用されます。

$ cat numbers
1234
12121
3434
123
$sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers
1,234
12,121
3,434
123

  1. コックピット:Web ベースの Linux サーバー管理を簡素化

    コックピット は、使いやすく、軽量で、シンプルかつ強力な GNU/Linux サーバー用のリモート マネージャーであり、Web ブラウザ経由でライブ Linux セッションを提供する対話型のサーバー管理ユーザー インターフェイスです。 いくつかの RHEL ベースの Linux ディストリビューションと、Ubuntu を含む Debian 派生版で実行できます。 、Linux ミント 、フェドーラ 、CentOS 、ロッキー リナックス 、AlmaLinux 、アーチ Linux コックピット Linux を検出可能にすることで、システム管理者がコンテナの起動、ストレージの管理、ネットワ

  2. GTD で生産性をマスターする:物事を成し遂げるための実証済みのガイド

    好きなことをするためにもっと時間が必要ですか?もちろん、そうですよね。オタクにとっては取り組むべき技術プロジェクトが山ほどありますが、時間が足りません。 長年にわたり、私は時間管理や生産性向上のシステムをいくつか試してきました。それらはすべて私の成長を助けてくれましたが、それらのシステムには私の働き方や考え方と合わないところがありました。 数年前、David Allen の Getting Things Done (GTD) に出会い、すぐにそれが私の働き方と考え方にぴったりだと感じました。 GTD なしの生活はもう想像できません。 GTD は、生産性を高めるためにどのソフトウェアやツー