3つのコマンドのうちの1つを使用したいsed(番号範囲)

3つのコマンドのうちの1つを使用したいsed(番号範囲)

テキストファイルがあります。 (テスト.txt)

1970-01-01
1971-01-01
1972-01-01
1973-01-01
1974-01-01
....
1993-01-01
1994-01-01
1995-01-01
1996-01-01
...
2015-01-01
2016-01-01

私は上の1995年および1970年のラインを消したいと思う。

以下は私が作成したsedコマンドです。

sed -i '/197[0-9]/d' test.txt
sed -i '/198[0-9]/d' test.txt
sed -i '/199[0-5]/d' test.txt

これら3つのコマンドを1つのsedコマンドに結合する方法はありますか?

答え1

ファイルがソートされているように見えるので、最初から最後まで削除することができます。

例えば

sed -i '1,/^1995/d' test.txt

日付が1970年以前に開始された場合

sed -i '/^1970/,/^1995/d' test.txt

あなたのファイルの場合いいえ持っていないという理由でシンプル正規表現(長くて退屈な正規表現がある)はすべての行に一致しますが、2つ以上を指定できます。

sed -i -e '/^19[78][0-9]/d' -e '/^199[0-5]/d' test.txt

答え2

操作の場合、通常はawkを使用する方が簡単です。たとえば、1970年から1995年の年を含む行を除くすべての行を印刷するには、次のようにします。

$ awk -F- '$1<1970 || $1 > 1995' test.txt
....
1996-01-01
...
2015-01-01
2016-01-01

ここでは、-F-awkに-フィールド区切り文字として使用するように指示します。つまり、最初のフィールド(で示される$1)が年になります。

sedとは異なり、awkは数学演算を実行します。したがって、$1<1970年が1970年より小さい場合は真です。 $1 > 1995年が1995年より大きい場合は真です。 ||論理ORを使用してこれら2つの条件を結合します。したがって、$1<1970 || $1 > 1995維持したい期間も同様です。

答え3

これら3つを正規表現で組み合わせることができます。

sed -i '/19[789][0-9]/d' test.txt

3番目の文字が「7」、「8」、または「9」であることを確認してください。

線の先頭に基準点を追加することもできます。

sed -i '/^19[789][0-9]/d' test.txt

これは、途中で「1970」または「1987」の行が削除されるのを防ぐためです。 (通常)正規表現はできるだけ狭くしたいので、必要なものだけを取ります。

関連情報