sed を使用してパス文字列から最後の / を削除します。

sed を使用してパス文字列から最後の / を削除します。

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番目)の文字を削除します/。一部の実装では、改行文字ではない最大文字シーケンスのサイズ(バイト単位)は、システムコール引数でサポートされているパスの最大サイズよりも大きくない(通常は短い)と想定されます。$$$filesed$fileLINE_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

関連情報