GNU/Linux >> Linux の 問題 >  >> Linux

複数行の文字列の最後の行に指定されたパターンが含まれているかどうかのシェルテスト?

複数行の文字列が指定されたパターンを含む行で終わっているかどうかを確認したい。

これらのコードは失敗しました。一致しません。

s=`echo hello && echo world && echo OK`
[[ "$s" =~ 'OK$' ]] && echo match

承認された回答:

bashで 3.2以降、および3.1との互換性が有効になっていない場合( compat31 を使用) オプションまたはBASH_COMPAT=3.1 )、正規表現演算子を引用します( だけでなく) ただし、 bashのいずれかを使用します 引用演算子('...' "..." $'...' $ "..." ))それらの特別な意味を削除します。

[[ $var =~ 'OK$' ]]

OK $を含む文字列にのみ一致します 文字通り(その $ リテラルの$に一致します )

[[ $var =~ OK$ ]]

OKで終わる文字列に一致 (その $ 文字列の最後に一致するRE演算子です。

これは、変数に格納されている正規表現や、置換の結果にも当てはまります。

[[ $var =~ $regexp ]]   # $var matches $regexp
[[ $var =~ "$string" ]] # $var contains $string

シェル構文で引用する必要のある文字(空白、 <など)があるため、扱いにくくなる可能性があることに注意してください。 、> 、一致しない場合は括弧)。たとえば、。{3} <> [)}]&と照合する場合 正規表現(3文字の後に "<>" のいずれか または} および )、次のようなものが必要です:

[[ $var =~ .{3}" <> "[})]& ]]

どの文字を引用符で囲む必要があるかわからない場合は、いつでも一時変数を使用できます。これは、コードが bash31と互換性があることも意味します 、 zsh またはksh93

pattern='.{3} <> [})]&'
[[ $var =~ $pattern ]] # remember *not* to quote $pattern here

これが唯一の方法でもあります( compat31 を使用する以外の方法) オプション(または BASH_COMPAT =3.1 ))システムの正規表現の非POSIX拡張演算子を利用できます。

たとえば、<の場合 多くの正規表現エンジンで使用されている単語の境界として扱われるには、次のものが必要です。

pattern='<word>'
[[ $var =~ $pattern ]]

実行中:

[[ $var =~ <word> ]]

bashとしては機能しません それらのを扱います シェル引用演算子として、 を渡す前にそれらを削除します 正規表現ライブラリに移動します。

ksh93ではさらに悪化することに注意してください。

[[ $var =~ "x.*$" ]]

たとえば、 whatever-xa *に一致します ただし、 whatever-xfooではありません 。上記の引用は、 *の特別な意味を削除します 、ただしではありません。 また、 $

zsh 動作はより単純です。引用符はそこでの正規表現演算子の意味を変更せず(bash31のように)、より予測可能な動作になります(EREの代わりにPCRE正規表現を使用することもできます( set -o rematchpcre ))。

関連:新しいファイルを作成するためのNautilusコンテキストメニューオプション?

yash [[...]]がありません 構築しますが、その [ ビルトインには=〜があります 演算子( zshにもあります )。そしてもちろん、 [ 通常のコマンドであるため、引用符は正規表現演算子の解釈方法に影響を与えることはできません。

また、厳密に言えば、 $ s 3行は含まれていませんが、2行の完全な行とそれに続く未終端の行が含まれています。 hellonworldnOKが含まれています 。 OK $で 拡張正規表現、 $ 演算子は文字列の最後でのみ一致します 。

3行の文字列 hellonworldnOKnのように (コマンド置換ストリップ all として、コマンド置換では取得できません。 末尾の改行文字)、 $ nの後に一致します 、つまり OK $ 一致しません。

zsh -o pcrematchを使用 ただし、 $ PCRE_DOLLAR_ENDONLY を通過しないため、文字列の最後と文字列の最後の改行の前の両方に一致します。 pcre_compileへのフラグ 。一般に、シェルの変数には末尾の改行文字が含まれていないため、これは悪い考えと見なされる可能性があります。含まれている場合は、通常、データと見なされます。


Linux
  1. シェルのコマンド出力から最初/最後の「n」行を削除するにはどうすればよいですか?

  2. 巨大なファイルの線Xから線Yへの猫?

  3. 文字列内のパターンを見つけるためのシェルテスト?

  1. パターンに一致する行を別のファイルの行に順番に置き換えますか?

  2. ファイルに複数の行を追加するにはどうすればよいですか?

  3. Linux シェルでは、複数行の文字列の各行をどのように処理できますか?

  1. Linuxコマンドラインで複数のファイルの文字列を置き換える方法

  2. 複数行の出力を 1 行に連結する方法は?

  3. シェルスクリプトを使用して、指定されたパターンの後にファイルに複数の行を挿入します