次のファイルにパス名のリストがあります。
/path/to/directory/one.txt
/longer/path/to/some/directory/two.py
/path/with spaces/in/it/three.sh
最後の「/」以降のすべての文字を削除したいので、上記の出力は次のようになります。
/path/to/directory/
/longer/path/to/some/directory/
/path/with spaces/in/it/
答え1
sed 's![^/]*$!!'
これは次のことを行います。
/
正規表現にはが含まれているので、ではなく区切り文字を使用してください/
。 (私は区切り線のように見えるので、他の人は、、または好きなように!
使用します。|
@
#
^
/
/
- を除く(0個以上の)文字で構成される文字列を見つけます
/
。 (最大の長さ。)ただ、行末になければなりません。 - そして何でも交換してください。
注:文字を含まない入力行は/
完全に消去されます(つまり、行の内容全体が削除され、空白行のみが残ります)。この問題を修正してスラッシュのない行を残すには、コマンドを次のように変更できます。
sed 's!/[^/]*$!/!'
最後の答えと一致する点を除いて、最初の答えと同じです。/
そしてその後のすべての文字をaに置き換えます/
(実際には、/
入力行の最後の文字をそのまま残します)。したがって、最初の答えを見つけてone.txt
nullに置き換えると、この答えを見つけて/one.txt
nullに置き換えます/
。ただし、文字が含まれていない行では、/
最初の回答が行全体と一致して何も置き換えられませんが、この回答は一致するものを見つけることができず、置き換えられません。
このコマンドには区切り文字を使用できますが、/
必ず区切り記号を使用する必要があります。
sed 's/\/[^/]*$/\//'
正規表現と置換文字列の前に「エスケープされた」スラッシュを追加する後ろにスラッシュ( \
)。何人かの人々はこの「寄り木」ジャングルを読んで維持するのがより難しいと思うかもしれませんが、これは基本的にスタイルの問題につながります。
答え2
次のユーティリティを使用できますdirname
。
xargs -I {} dirname {} <file.txt
これにより、リスト内の各親ディレクトリのパス名が提供されます。与えられたリストに対して以下を生成します。
/path/to/directory
/longer/path/to/some/directory
/path/with spaces/in/it
パスに改行を含めるには、次のようにします。
/some/path with a \
newline/in/it
引用符を含めるには、たとえばとしてエスケープします\"
。