Вы можете удалить любую строку, которая не соответствует шаблону d1d2/M1M2/M2M1d2d1
. Чтобы проверить это, сопоставьте и запишите все цифры дня и месяца отдельно :
sed -E '/^([0-9])([0-9])\/([0-9])([0-9])\/\4\3\2\1$/!d' file > outfile
Или с помощью 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
См. Онлайн-демонстрацию
Часть sed -En 's,([0-9])([0-9])/([0-9])([0-9])/.*,\4\3\2\1,p
получает первые четыре цифры и переупорядочивает их. "${line##*/}"
использует расширение параметра, чтобы удалить как можно больше символов с начала до последнего /
(включая его).