Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash SED命令检查日期是否为回文_Bash_Sed_Backreference - Fatal编程技术网

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

Bash 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

我有一个日期格式为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|([0-9]{2})/([0-9]{2})/([0-9]{4})|\3\2\1|" dates.txt
以下是我得到的:

20200202
19982508
20300203
20210212
19601906
20101001
21000703

您可以删除与
d1d2/M1M2/M2M1d2d1
模式不匹配的任何行。要进行检查,请分别匹配和捕获每天和每月的数字:

或者,使用GNU
sed

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