我有日期格式为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
您可以逐行阅读文件,在几天和几个月内交换数字并将它们连接起来,然后将值与年份部分进行比较:
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##*/}"
使用参数扩展从开始到最后一个/
(包括它)都删除尽可能多的字符。
您可以在模式匹配中反向引用:
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