多くのファイルパスとその情報を格納する大きなテキストがあります。
# just for demostration
/a/b/c/d/e
/a/b/c/d
/a/b/c
/a/b
/a
/b/c
/b
/c/d
/c
....
特定の数の特定の文字を持つ文字だけを表示したいです。例えば、
- 単一
/
- 2個以下
/
これにより、ルートフォルダのみを抽出するか、最初のレベルのサブフォルダのみを抽出します。
答え1
Awk
解決策:
- 1つだけ/
:
awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }NF == sep' file
出力:
/a
/b
/c
- 2個以下/
:
awk -v sep=2 'BEGIN{ FS=OFS="/"; sep += 1 }NF <= sep' file
出力:
/a/b
/a
/b/c
/b
/c/d
/c
sep
- 変更可能仕切りセダFS
およびOFS
- は、それぞれフィールド区切り記号と出力フィールド区切り記号です。NF
- 代表するフィールドの総数
上記の方法を1つのコマンドにまとめる必要がある場合awk
:
awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }(sep==2 && NF==sep) || (sep>2 && NF<=sep)' file
答え2
拡張正規表現を使用してください。
grep -E '^([^/]*/[^/]*){1,2}$' input
結果は次のとおりです。
/a/b
/a
/b/c
/b
/c/d
/c
正規表現の構文は次のことを意味します。
^
- 行の先頭に固定( ... )
- 次のビットを一緒にグループ化します。[^/]*
- スラッシュ以外の文字、0個以上/
- スラッシュ[^/]*
- スラッシュ以外の文字、0個以上{1,2}
- 1つまたは両方のグループ$
- ラインの最後までアンカー