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
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
我有日期格式为 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
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