SED 命令检查 DATE 是否回文

SED commandd to check DATE is palindromic

我有日期格式为 MM/D/YYYY 的文件,名为 dates.txt

02/02/2020
08/25/1998
03/02/2030
12/02/2021
06/19/1960
01/10/2010
03/07/2100 

我需要单行 SED 命令来打印回文。例如 02/02/2020 是回文,而 08/25/2020 不是。预期输出为:

02/02/2020
03/02/2030
12/02/2021

到目前为止我所做的是从日期格式中删除 / 。如何检查从头到尾输出的读数是否相同?

sed -E "s|([0-9]{2})/([0-9]{2})/([0-9]{4})||" dates.txt

这是我得到的:

20200202
19982508
20300203
20210212
19601906
20101001
21000703

您可以删除任何与 d1d2/M1M2/M2M1d2d1 模式不匹配的行。要检查这一点,请分别匹配和捕获每个日期和月份的数字 :

sed -E '/^([0-9])([0-9])\/([0-9])([0-9])\/$/!d' file > outfile

或者,使用 GNU sed

sed -i -E '/^([0-9])([0-9])\/([0-9])([0-9])\/$/!d' file

^表示字符串开始位置,$表示字符串结束。 最后的 !d 告诉 sed 到 "drop" 不遵循此模式的行。

参见online demo

或者,当您有更复杂的情况时,您可以逐行读取文件,交换天数和月数的数字并将它们连接起来,并将值与年部分进行比较。如果需要,您可以在那里执行更多操作:

while IFS= read -r line; do
  p1="$(sed -En 's,([0-9])([0-9])/([0-9])([0-9])/.*,,p' <<< "$line")";
  p2="${line##*/}";
  if [[ "$p1" == "$p2" ]]; then
    echo "$line"
  fi
done < file > outfile

online demo

sed -En 's,([0-9])([0-9])/([0-9])([0-9])/.*,,p部分获取前四位数字并重新排序。 "${line##*/}" 使用参数扩展从开始到最后一个 /(包括它)删除尽可能多的字符。

您可以在模式匹配中反向引用:

sed -n '/\([0-9]\)\([0-9]\)\/\([0-9]\)\([0-9]\)\//p'

使用扩展的正则表达式和点看起来很不错:

sed -rn '/(.)(.)\/(.)(.)\//p'
sed -rn '\@(.)(.)/(.)(.)/@p'      # means the same