![我想使用三个命令 sed (数字范围)之一](https://linux22.com/image/93374/%E6%88%91%E6%83%B3%E4%BD%BF%E7%94%A8%E4%B8%89%E4%B8%AA%E5%91%BD%E4%BB%A4%20sed%20%EF%BC%88%E6%95%B0%E5%AD%97%E8%8C%83%E5%9B%B4%EF%BC%89%E4%B9%8B%E4%B8%80.png)
有一个文本文件。(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”的行。您(通常)希望正则表达式尽可能窄,因此它只需要您想要的内容。