一致する文字列の前のすべてを抽出します。

一致する文字列の前のすべてを抽出します。

私にはロープがあります。

hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/

私が望むもの

hdfs://ussbssn01.us.xyz.com//

//awk、sedを試しましたが、一致する文字列が重複しており、期待した結果が得られませんでした。希望の結果を得る方法はありますか?

答え1

最初の 2 つの文字列に一致する文字列を取得するには、次のようにします。

$ s=hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/
$ echo "$s" | awk -F// '{print $1 FS $2 FS}'
hdfs://ussbssn01.us.xyz.com//

仕組み:

  • -F//

    これは awk に//フィールド区切り文字として使用するように指示します。

  • print $1 FS $2 FS

    これにより、awk に、最初のフィールド、フィールド区切り文字、2 番目のフィールド、その他のフィールド区切り文字を印刷するように指示します。

選ぶ

最後に一致する文字列を含むすべてを取得するには:

$ echo "$s" | awk -F// '{$NF=""} 1' OFS=//
hdfs://ussbssn01.us.xyz.com//

仕組み:

  • -F//

    これはawkに//フィールド区切り文字として使用するように指示します。入力する

  • $NF=""

    これはawkに最後のフィールドを空の文字列に置き換えるように指示します。

  • 1

    これはprint-the-recordのawkの秘密の略語です。

  • OFS=//

    これはawkに//フィールド区切り文字として使用するように指示します。出力

答え2

そしてgrep

$ grep -o '^.*//.*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?//.*?//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?com//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//
  • グループが2つしかない場合は、最初の方法が機能します。//
  • 2番目は2番目のグループの大部分を抽出します。//
  • 3番目は、目的の文字列が次に終わる場合に有効です。com//

編集する:

[^/]*@ilkkachuが指摘したように、2番目のケースではなく(0文字以上の文字を除く)を使用できます。例:/.*?

$ grep -o '^[^/]*//[^/]*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa//"
hdfs://ussbssn01.us.xyz.com//

答え3

varksh文字列がシェル変数に存在する場合、またはbash

$ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
$ printf "%s\n" "${var%//*}"
hdfs://ussbssn01.us.xyz.com

変数置換は値を${var%suffix}切り捨てます。suffixvar

関連情報