sedを使用して次のディレクトリ構造の最後の/を置き換えようとしましたが、成功しませんでした。どんな提案がありますか?
入力はで、/tmp/ABC/Dirs/
出力は次のようになります。/tmp/ABC/Dirs
echo " /tmp/ABC/Dirs/" | sed -r "s/\/(?:[a-zA-Z0-9])/g"
答え1
sed
/
bash
ここではやや過度に見えます。 Kornシェル(およびPOSIXがこのユーティリティにKornシェル機能を指定したため、すべてのPOSIX準拠シェルなどの同様のシェルsh
)から末尾を直接削除できます。
$ foo=/tmp/ABC/Dirs/
$ echo "${foo%/}"
/tmp/ABC/Dirs
答え2
with を使用するには、sed
次のようにします。
file=/any/path
sed '$s|/$||' << EOF
$file
EOF
つまり、に保存されているパスの最後(最初)の行の終わり(2番目)の文字を削除します/
。一部の実装では、改行文字ではない最大文字シーケンスのサイズ(バイト単位)は、システムコール引数でサポートされているパスの最大サイズよりも大きくない(通常は短い)と想定されます。$
$
$file
sed
$file
LINE_MAX
/
または、特別な場合は、//
末尾を削除するのが/
理想的ではないかもしれません。/
たとえば、すべての末尾/foo/bar///
。
それから多分もっと高級より合理的な理由sed
は次のとおりです。
sed '
${
s|\([^/]\)/*$|\1|
s|^////*|/|
1b
s|/*$||
}' << EOF
$file
EOF
つまり、//
そのままにして///
調和に変えて/////
調和になってください。/
/
foo//
foo
$'foo\n//'
$'foo\n'
(?:...)
これは、拡張正規表現演算子(このGNU固有のオプションを使用してGNUとして識別される)ではなく、Perl正規表現演算子です。sed
-r
答え3
私のコメントで質問に答えた最初の人ですs/\/$//
。
その日、他の人がより包括的な答えを提供する時間があります。
だから今日 - 数日後 - "ピアプレス"の像がリストから消えたいので、重複した答えを投稿します。
sed -e s./$..g # You can golf the quotes and the "\" here
だから、すべての支持者は今回は-3まで反対投票をしてください:)
答え4
sedの代わりにPerlを使用できます。
echo "/tmp/ABC/Dirs/" | perl -pne "s/\/$//g"
出力
/tmp/ABC/Dirs