Grep は行の先頭または途中でパターンを探します。

Grep は行の先頭または途中でパターンを探します。

この質問が聞こえるほど純粋ではないと思うという点から始めましょう。

何をすべきか:フォルダのPATH環境変数を確認してください。最初にあっても後であってもかまいません。フォルダが存在することを確認してください。

私の質問の例 - を試してみましょう/opt/gnome


シナリオ1:フォルダがPATHの先頭にありません。

# echo "$PATH"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome

# echo "$PATH" | grep ":/opt/gnome"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome

/var/opt/gnomegrepはコロンを捕捉しないように十分に具体的でなければなりません。


シナリオ2:フォルダはPATHの先頭にあります。

# echo "$PATH"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome

# echo "$PATH" | grep "^/opt/gnome"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome

私の問題は次のとおりです。このフォルダでコロンまたは行の先頭を検索する必要があります。私がやりたいことは、次の2つの角かっこ式の1つです。

# echo $PATH | grep "[^:]/opt/gnome"
# echo $PATH | grep "[:^]/opt/gnome"

しかし、[^そして[:それ自体の意味があります。したがって、上記の2つのコマンドは機能しません。

1つのコマンドで両方の場合をgrepする方法はありますか?

ベストアンサー1

PATHファイルで何かを探すのではなく、環境変数の内容を調べると、これはgrep無効なツールです。シェルでこれを行う方が簡単で(より速く、おそらくより読みやすくなります)。

Bash、ksh、zshから:

if [[ :$PATH: = *:/opt/gnome:* ]]; then
 : # already there
else
  PATH=$PATH:/opt/gnome
fi

持ち運べる:

case :$PATH: in
  *:/opt/gnome:*) :;; # already there
  *) PATH=$PATH:/opt/gnome;;
esac

:$PATH:;代わりに;を使用してください$PATH。これにより、コンポーネントがの先頭または末尾にあっても、検索文字列内で常にコロンで囲まれます$PATH

ファイルの1行を検索する場合は、拡張正規表現(requireなどgrep -E)を使用して(^|:)/opt/gnome($|:)一致させることができますが/opt/gnome、行の先頭またはコロンの後にある場合、および行の最後にある場合にのみ可能です。その後はコロンが続きます。

おすすめ記事