/が最初に表示されるまで、すべての文字を空白に置き換えます。

/が最初に表示されるまで、すべての文字を空白に置き換えます。

これは文字列(シェル変数の値)です。

2908104 /var/cache/yum/x86_64/7Server/Patches/gen

予想出力:

/var/cache/yum/x86_64/7Server/Patches/gen

最初の/で始まる値のみを取得するにはどうすればよいですか?私はsedに初めてアクセスし、Linuxを初めて使用します。

ベストアンサー1

Linuxをカーネルとして使用するシステムgrep(RHELのGNUおよび他の一般的なGNU / Linuxディストリビューション、ほとんどのLinuxベースのシステムのbusybox、Androidのtoybox)では、一般的な実装で次のことができます。

LC_ALL=C grep -o '/.*' <input

/複数の行がある場合は、最初の行から始めて部分を印刷します。

POSIX的に:

LC_ALL=C sed -n 's|^[^/]*/|/|p' <input

文字列がPOSIX様シェル(sh実際にはbashPOSIXモードのRHEL)のシェル変数に格納されている場合。

new_string=${string#"${string%%/*}"}

(何も含まれていない場合は$new_string空です)$string/

${string%%/*}最長一致サフィックスを削除します/*。結果は、${string#pattern}そのパターンに一致する最短の接頭辞が削除されたパターンと見なされます。ここでは${string%%/*}、引用したようにパターンではなくリテラル文字列として扱います。

を使用すると、zsh次の操作も実行できます。

new_string=${(M)string%%/*}

とともにM パラメータ拡張フラグ、これらすべての${string#pattern}(または##、、、:#)演算子は、一致する部分を削除せずに追加の%部分(それなしで削除される部分)に拡張します。%%M

/以外の文字をすべて削除することもできます。

  • zsh:

    set -o extendedglob
    new_string=${string##[^/]#}
    
  • ksh93/ bash -O extglob:

    new_string=${string##*([^/])}
    

ここでX#、(zsh)または(ksh)はゼロ個以上のsと一致し、これは上記の正規表現*(X)と同じです。XX*grepsed


1はスマート電球、テレビ、またはネットワークデバイスに組み込まれることが多いため、エンドユーザーはシェルやユーティリティ(存在する場合)と対話することはほとんどありません。

おすすめ記事