152

次のような文字列があります。

/var/cpanel/users/joebloggs:DNS9=domain.com

この文字列からユーザー名 ( joebloggs) を抽出し、変数に格納する必要があります。

joebloggs文字列の形式はandを除いて常に同じなので、 ?domain.comを使用して文字列を 2 回分割できると考えています。cut

最初の分割は分割され:、最初の部分を変数に格納して 2 番目の分割関数に渡します。

2 番目の分割は、最後の単語 ( ) で分割し、変数に/格納します。joebloggs

配列と分割を使用してphpでこれを行う方法は知っていますが、bashでは少し迷っています。

4

6 に答える 6

406

joebloggs追加のプロセスなしでパラメーター拡張を使用して bash でこの文字列から抽出するには...

MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com" 

NAME=${MYVAR%:*}  # retain the part before the colon
NAME=${NAME##*/}  # retain the part after the last slash
echo $NAME

joebloggsパスの特定の深さに依存しません。


概要

参照用に、いくつかのパラメーター拡張モードの概要...

${MYVAR#pattern}     # delete shortest match of pattern from the beginning
${MYVAR##pattern}    # delete longest match of pattern from the beginning
${MYVAR%pattern}     # delete shortest match of pattern from the end
${MYVAR%%pattern}    # delete longest match of pattern from the end

したがって#、最初から一致することを意味し (コメント行を考えてください) %、最後から一致することを意味します。1 つのインスタンスは最短を意味し、2 つのインスタンスは最長を意味します。

数値を使用して、位置に基づいて部分文字列を取得できます。

${MYVAR:3}   # Remove the first three chars (leaving 4..end)
${MYVAR::3}  # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)

以下を使用して、特定の文字列またはパターンを置き換えることもできます。

${MYVAR/search/replace}

patternファイル名の一致と同じ形式であるため、 (任意の文字) が一般的で、多くの場合、または*のような特定の記号が続きます。/.

例:

次のような変数が与えられた場合

MYVAR="users/joebloggs/domain.com" 

ファイル名を残してパスを削除します (スラッシュまでのすべての文字):

echo ${MYVAR##*/}
domain.com

ファイル名を削除し、パスを残します (最後の最短一致を削除します/):

echo ${MYVAR%/*}
users/joebloggs

ファイル拡張子だけを取得します (最後のピリオドより前のすべてを削除します):

echo ${MYVAR##*.}
com

注: 2 つの操作を行うには、それらを結合することはできませんが、中間変数に代入する必要があります。したがって、パスまたは拡張子なしでファイル名を取得するには:

NAME=${MYVAR##*/}      # remove part before last slash
echo ${NAME%.*}        # from the new var remove the part after the last period
domain
于 2013-10-20T21:16:01.730 に答える
24

セッドはどうですか?それは単一のコマンドで機能します:

sed 's#.*/\([^:]*\).*#\1#' <<<$string
  • 文字列が含まれて#いるため、正規表現の区切り記号に使用されています。//
  • .*/最後のバックスラッシュまで文字列を取得します。
  • \( .. \)キャプチャ グループをマークします。これは\([^:]*\)
    • [^:]コロンを除く任意の文字を表し、*はゼロ以上を意味します。
  • .*行の残りを意味します。
  • \1最初の (そして唯一の) キャプチャ グループで見つかったものを置き換えることを意味します。これが名前です。

文字列を正規表現と一致させる内訳は次のとおりです。

        /var/cpanel/users/           joebloggs  :DNS9=domain.com joebloggs
sed 's#.*/                          \([^:]*\)   .*              #\1       #'
于 2014-12-24T20:54:11.240 に答える
13

単一の Awk を使用する:

... | awk -F '[/:]' '{print $5}'

つまり、フィールド区切り文字として/またはを使用する:と、ユーザー名は常にフィールド 5 に表示されます。

変数に格納するには:

username=$(... | awk -F '[/:]' '{print $5}')

sedユーザー名をフィールド 5 にする必要がない、より柔軟な実装:

... | sed -e s/:.*// -e s?.*/??

つまり、それ:以降をすべて削除してから、最後の まですべてを削除します/sedはおそらく よりも高速awkであるため、この代替手段は間違いなく優れています。

于 2013-10-20T20:08:58.143 に答える
11

単一の sed を使用する

echo "/var/cpanel/users/joebloggs:DNS9=domain.com" | sed 's/.*\/\(.*\):.*/\1/'
于 2013-10-20T21:08:06.080 に答える