Bash SED命令检查日期是否为回文
我有一个日期格式为MM/D/YYYY的文件,名为dates.txtBash SED命令检查日期是否为回文,bash,sed,backreference,Bash,Sed,Backreference,我有一个日期格式为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命令来打印回文。例如,2020年2月2日是回文,而2020年8月25日不是。预期产出为: 02/02/2020 03/02/2030 12/02/2021 到目前为止,我所做的是删除/删除日期格式。如何检查从开始到结束的输出读数是否相同 sed -E "s
02/02/2020
08/25/1998
03/02/2030
12/02/2021
06/19/1960
01/10/2010
03/07/2100
我需要一行SED命令来打印回文。例如,2020年2月2日是回文,而2020年8月25日不是。预期产出为:
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
您可以删除与
d1d2/M1M2/M2M1d2d1
模式不匹配的任何行。要进行检查,请分别匹配和捕获每天和每月的数字:
或者,使用GNUsed
:
sed -i -E '/^([0-9])([0-9])\/([0-9])([0-9])\/\4\3\2\1$/!d' file
^
表示字符串位置的开始,$
表示字符串的结束。
!末尾的d
告诉sed删除不遵循此模式的行
看
或者,当您遇到更复杂的情况时,可以逐行读取文件,以天和月为单位交换数字并将其串联,然后将值与年份部分进行比较。如果需要,您可以在那里执行更多操作:
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
而IFS=read-r行;做
p1=“$(sed-En,([0-9])([0-9])/([0-9])/([0-9])/*,\4\3\2\1,p'您可以在模式匹配中反向引用:
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
试试@WiktorStribiżew是的,它很管用!只要将其更正为使用文件而不是硬编码的inputOk,我希望看到一个真正的sed
解决方案的希望就烟消云散了。使用GNU grep:grep-E'()/(../\4\3\2\1'文件
是的,这个解决方案很管用,它是一行解决方案
sed -rn '/(.)(.)\/(.)(.)\/\4\3\2\1/p'
sed -rn '\@(.)(.)/(.)(.)/\4\3\2\1@p' # means the same