私にはロープがあります。
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
var
ksh
文字列がシェル変数に存在する場合、またはbash
:
$ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
$ printf "%s\n" "${var%//*}"
hdfs://ussbssn01.us.xyz.com
変数置換は値を${var%suffix}
切り捨てます。suffix
var