SED命令检查日期是否为回文

问题描述 投票:1回答:2

我有日期格式为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})|\3\2\1|" dates.txt

这是我得到的:

20200202
19982508
20300203
20210212
19601906
20101001
21000703
bash sed
2个回答
0
投票

您可以逐行阅读文件,在几天和几个月内交换数字并将它们连接起来,然后将值与年份部分进行比较:

while IFS= read -r line; do
  p1="$(sed -En 's,([0-9])([0-9])/([0-9])([0-9])/.*,\4\3\2\1,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])/.*,\4\3\2\1,p部分获取前四位数字并重新排序。 "${line##*/}"使用参数扩展从开始到最后一个/(包括它)都删除尽可能多的字符。


0
投票

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

sed -n '/\([0-9]\)\([0-9]\)\/\([0-9]\)\([0-9]\)\/\4\3\2\1/p'

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

sed -rn '/(.)(.)\/(.)(.)\/\4\3\2\1/p'
sed -rn '\@(.)(.)/(.)(.)/\4\3\2\1@p'      # means the same
© www.soinside.com 2019 - 2024. All rights reserved.