特定の数の特定の文字を含む行を印刷します。

特定の数の特定の文字を含む行を印刷します。

多くのファイルパスとその情報を格納する大きなテキストがあります。

# just for demostration
/a/b/c/d/e
/a/b/c/d
/a/b/c
/a/b
/a
/b/c
/b
/c/d
/c
....

特定の数の特定の文字を持つ文字だけを表示したいです。例えば、

  1. 単一/
  2. 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つまたは両方のグループ
  • $- ラインの最後までアンカー

関連情報