2016-06-17 1 views
1

2つの文字列間のテキストを削除するいくつかの解決策が見つかりましたが、私のケースは少し異なると思います。1つの文字列と別の文字列の最初の文字列の間のテキストを削除します

私は、この変換しようとしています:基本的にはファイル名からバージョン固有の情報を削除

/nz/kit/bin/adm/tools/hostaekresume 

:これに

/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume 

を。 私が見つけた解決策は、kitという単語から最後のの出現をすべて削除します。/です。 kitから最初にになるものが必要です。

私が見た中で最も一般的な解決策は、次のとおりです。

/nz/kit/hostaekresume 

にはどうすればいいだけ最初/までを削除することができます生成

sed -e 's/\(kit\).*\(\/\)/\1\2/' 

?私はこれがsedまたはawkでできていると仮定しますが、提案にはオープンです。

答えて

2
$ sed 's|\(kit\)[^/]*|\1|' <<< '/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume' 
/nz/kit/bin/adm/tools/hostaekresume 

これは、異なる区切り記号(|代わりの/)を使用していますので、我々は/をエスケープする必要はありません。次に、貪欲でない一致の場合は以外の任意の数の文字がで、kitと次の/の間に一致します。[^/]*が使用されます。

あなたは何を削除することは、ドットと数字で構成され、文字列の他に何もそれらが含まれていない、あなたはparameter expansionを使用することができることを知っていれば別の方法として、:

$ var='/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume' 
$ echo "${var//[[:digit:].]}" 
/nz/kit/bin/adm/tools/hostaekresume 

構文は${parameter/pattern/string}patternであります拡張されたparameterstringに置き換えられます。 /の代わりに//を使用すると、最初のものだけでなくすべてのオカレンスが置き換えられます。我々の場合には

parametervarで、パターンが[[:digit:].](数字またはドット–これは仕方によってグロブパターンではなく、正規表現、である)であり、我々はただ削除/string部分をスキップしましたパターン(何も置き換えない)。

+0

完璧、ありがとう! –

0

非貪欲な正規表現の場合はperlが必要です。 sedはそれをまだしていません。 /は、正規表現に混乱させる可能性があるため、|を区切り文字として使用してください。

perl -pe 's|(kit).*?(/.*)|\1\2|'

.*?パターン非貪欲を行い、/の最初のインスタンスに一致します。

echo "/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume" | perl -pe 's|(kit).*?(/.*)|\1\2|'
戻り
/nz/kit/bin/adm/tools/hostaekresume

0
echo "/nz/kit.7.2.0.7/bin/adm/tools/hostaekresume" | awk '{sub(/.7.2.0.7/,"")}1' 
/nz/kit/bin/adm/tools/hostaekresume 
+0

私は7.2.0.7の場所に何が存在するのかわからないので、私はそれを検索することはできません。私が知っている唯一のことは、 "キット"で始まり、最初の "/"で終わることです。 –

関連する問題