スラッシュの前のすべての内容を印刷する方法を見つけましたが、スラッシュの後のすべての内容を印刷する必要があります。blablabal/important
印刷する必要があるこのような文字列がありますimportant
。スラッシュの前ではなく後ろのすべての内容を印刷するには、下の行をどのように変更する必要がありますか?
sed 's:/[^/]*$::'
答え1
最後のスラッシュの前のすべての項目を削除してください。
$ echo "blablabal/important" | sed 's:.*/::'
important
また、複数のスラッシュでも動作します。
$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
答え2
他の答えは、ファイルにすべて処理する必要がある複数のデータ行があると仮定します。この場合、sed
またはawk
(またはcut
)は、すべての行を一度に処理するのに最適なツールです。
ただし、シェル変数に1行しかない場合(これを使用していると仮定bash
)、シェル拡張を使用して外部プロセスからユーティリティを作成することなく、目的の結果を得ることができます。
$ var="interesting/bla/blablabal/important"
$
$ # everything after the first slash:
$ echo "${var#*/}"
bla/blablabal/important
$ # everything after the last slash:
$ echo "${var##*/}"
important
$ # everything before the first slash:
$ echo "${var%%/*}"
interesting
$ # everything before the last slash:
$ echo "${var%/*}"
interesting/bla/blablabal
$
または、スラッシュで区切られた文字列がファイルパスであるとします。この場合、dirname
およびを使用してbasename
パスとファイル名の部分を取得できます。
$ # everything before the last slash:
$ dirname "$var"
interesting/bla/blablabal
$ # everything after the last slash:
$ basename "$var"
important
$
答え3
あなたのコメントでは、ファイルにスラッシュが1つしかないと述べましたが、それを使用しないでくださいawk
。
例:
❱ echo "blablabal/important" | awk -F'/' '{print $1}'
blablabal
❱ echo "blablabal/important" | awk -F'/' '{print $2}'
important
答え4
sed -et -e's|/|&\n|;//D' <in >out
...スラッシュを含む行から最初のスラッシュ以降のすべての内容を印刷し、それ以外の場合は変更されていない内容を印刷します。削除すると、変更された行だけが//
印刷されます。
\n
代わりにリテラルewlineを使用することもできます。n
ただし、バージョン\n
によって異なりますsed
。
そして発生回数を指定すると...
sed -et -e's|/|&\n|num;/\n/D'
...最大削除可能シリアル番号行のスラッシュは、少なくとも以下を含まない項目には影響しません。シリアル番号削減。