テキストファイルがあります。 (テスト.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」の行が削除されるのを防ぐためです。 (通常)正規表現はできるだけ狭くしたいので、必要なものだけを取ります。