
この質問が聞こえるほど純粋ではないと思うという点から始めましょう。
何をすべきか:フォルダの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/gnome
grepはコロンを捕捉しないように十分に具体的でなければなりません。
シナリオ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
、行の先頭またはコロンの後にある場合、および行の最後にある場合にのみ可能です。その後はコロンが続きます。
答え2
以下を使用して正規表現を拡張できます。grep -E
誤解を避けるために、探しているパスの先頭と終わりを一致させる必要があります。
先頭に一致する例:
$ TEST=/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
中間インスタンスとも一致します。
$ TEST=/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
偽陽性防止:
$ TEST="/home/bob/opt/gnome:/opt/gnome/somethingelse:/opt/gnome-beta"
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
そこには一致するものはありません。
コンパクトでエレガントです。 Debian 7 でテストされました。
答え3
未婚の場合は、次の記録をgrep
使用して分離することができます。awk
:
awk 'BEGIN {RS=":"} /^\/opt\/gnome$/'
答え4
答えが十分かどうかはわかりませんが、
grep -w "/opt/gnome"
あなたのニーズを満たすでしょう。
echo '/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
しかし、
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep "/opt/gnome" -o
/opt/gnome
/opt/gnome