web-dev-qa-db-ja.com

sedとgrepを使用して長さに基づいて行をフィルター処理する

sedおよびgrepを使用して100文字より長く150文字より短い行を見つける方法

4
user2280915

sed コマンドの使用

sed -nr '/^.{101,149}$/p' infile

内訳:

  • -n:印刷なし

-nオプションは、明示的な印刷要求が見つからない限り、何も印刷しないようにします(^.{101,149}$ "100(> = 101)より長く、150文字未満の行(<= 149)」)。印刷をオンに戻す1つの方法として使用される/pフラグ。

  • -r:-r(--regexp-extended)

-rは、拡張正規表現を有効にします。 sedが認識しない場合は-r-Eに置き換えます。sedのバージョンで中括弧がサポートされていない場合は中括弧をエスケープする必要があります。その場合、コマンドはsed -n '/^.\{101,149\}$/p' infileになります。

  • ^は、行頭の単なるアンカーであり、$は行末のアンカーです。

  • 単一の.は、任意の単一文字に一致します

したがって、sed -nr '/^.{101,149}$/p' infileを使用して、定義済みのルールが含まれているか含まれている行を最初から最後まで探しています。

これは、grepの機能をsedと複製する方法です。例:sed -n '/.../p':)

grep コマンドの使用

grep -E '^.{101,149}$' infile
  • -Eこれはsedの-rオプションと同じですが、grepコマンドを使用します。したがって、使用したくない場合は、中括弧をエスケープするだけです。

awk コマンドを使用する

awk 'length($0)>100 && length($0)<150' infile
  • lengthは行の長さを返します。 awkでは、$0は行全体を指定します。したがって、行の長さが100〜150の場合、印刷されます。
9
αғsнιη

bashを使用してこれを行う別の方法:

while read l; do nc=$(<<< "$l" wc -c); [ $nc -ge 101 ] && [ $nc -le 149 ] && echo "$l"; done < file

スクリプトに展開:

#!/bin/bash
while read l; do
    nc=$(<<< "$l" wc -c)
    if [ $nc -ge 101 ]; then
        if [ $nc -le 149 ]; then
            echo "$l"
        fi
    fi
done < file
1
kos