我想使用三个命令 sed (数字范围)之一

我想使用三个命令 sed (数字范围)之一

有一个文本文件。(test.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

有没有办法将这三个命令合并为一个命令 sed?

答案1

由于您的文件似乎已排序,因此您可以从头到尾删除

例如

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

如果日期在 1970 年之前开始,那么

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

如果你的文件不是为了那么没有简单的正则表达式(有一个又长又无聊的正则表达式)将匹配所有行,但您可以指定多个

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 年,则为 true。 $1 > 1995如果年份大于 1995 年,则为 true。 ||用逻辑或组合这两个条件。因此,$1<1970 || $1 > 1995对于您想要保留的年份来说也是如此。

答案3

您可以将这三个组合成一个正则表达式。

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

检查第三个字符是否为“7”、“8”或“9”。

您可能还想在行的开头添加一个锚点。

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

这是为了防止删除中间出现“1970”或“1987”的行。您(通常)希望正则表达式尽可能窄,因此它只需要您想要的内容。

相关内容