我有一个文本文件,其中包含多次出现的日期。所有日期均以格式书写Mon-DD-YYYY
。我必须在当前日期中更新所有这些日期,并保持格式Mon-DD-YYYY
。
脚本语言是bash
.一个大问题是我不知道如何将特定格式的日期与sed
、awk
、bash
内置函数等相匹配。
请问你能帮帮我吗?
答案1
设置current_date=$(date +"%m-%d-%Y")
或 到您想要的任何日期,然后运行
sed -i.bak "s/[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}/$current_date/g" your_file.txt
这样,您可以匹配文件中的任何日期并将其替换为 current_date
sed
在这种情况下,命令的工作方式类似于:sed "s/tobereplace/replacement/g"
。最后的g
代表全局,这意味着每次出现的 tobereplace 模式都将被替换所替换。
用于替换正则表达式模式[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}
被使用,这意味着
[0-9]
0 到 9 之间的任意数字\{2\}
两次- 连字符
- 再次相同,再次相同,但四次
\{4\}
编辑: 正如 FelixJN 在评论中提到的,您可能希望月份作为字符串,因为您可以在日期命令中使用 %b 并替换正则表达式的第一部分,如下所示:
current_date=$(date "+%b-%d-%Y")
sed -Ei "s/[A-Z][a-z]\{2\}-[0-9]\{2\}-[0-9]\{4\}/$current_date/g" your_file.txt
在这种情况下,正则表达式的工作方式如下:
[A-Z]
匹配从 A 到 Z 的任何大写字母。[a-z]\{2\}
匹配从 a 到 z 的任何小写字母两次
其余的和上面说的一样
答案2
使用乐(以前称为 Perl_6)
如果您从数字(2 位数字)月份开始:
~$ raku -pe 's:g/ \d**2 \- \d**2 \- \d**4 /{Date.today.mm-dd-yyyy("-")}/;' file
如果您从字母(3 个字母)月份开始:
~$ raku -pe 'BEGIN my %h = [Z=>] 1..12, <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>; \
s:g/ <{%h.values}> \- \d**2 \- \d**4 /{ join "-", %h{Date.today.month}, Date.today.day, Date.today.year }/;' file
输入示例:
Delaware Dec-07-1787; Pennsylvania Dec-12-1787; New Jersey Dec-18-1787; Georgia Jan-02-1788;
Connecticut Jan-09-1788; Massachusetts Feb-06-1788; Maryland Apr-28-1788; South Carolina May-23-1788;
New Hampshire Jun-21-1788; Virginia Jun-25-1788; New York Jul-26-1788; North Carolina Nov-21-1789;
Rhode Island May-29-1790; Vermont Mar-04-1791; Kentucky Jun-01-1792; Tennessee Jun-01-1796;
Ohio Mar-01-1803; Louisiana Apr-30-1812; Indiana Dec-11-1816; Mississippi Dec-10-1817;
Illinois Dec-03-1818; Alabama Dec-14-1819; Maine Mar-15-1820; Missouri Aug-10-1821;
Arkansas Jun-15-1836; Michigan Jan-26-1837; Florida Mar-03-1845; Texas Dec-29-1845;
Iowa Dec-28-1846; Wisconsin May-29-1848; California Sep-09-1850; Minnesota May-11-1858;
Oregon Feb-14-1859; Kansas Jan-29-1861; West Virginia Jun-20-1863; Nevada Oct-31-1864;
Nebraska Mar-01-1867; Colorado Aug-01-1876; North Dakota Nov-02-1889; South Dakota Nov-02-1889;
Montana Nov-08-1889; Washington Nov-11-1889; Idaho Jul-03-1890; Wyoming Jul-10-1890;
Utah Jan-04-1896; Oklahoma Nov-16-1907; New Mexico Jan-06-1912; Arizona Feb-14-1912;
Alaska Jan-03-1959; Hawaii Aug-21-1959;
示例输出:
Delaware Jul-4-2023; Pennsylvania Jul-4-2023; New Jersey Jul-4-2023; Georgia Jul-4-2023;
Connecticut Jul-4-2023; Massachusetts Jul-4-2023; Maryland Jul-4-2023; South Carolina Jul-4-2023;
New Hampshire Jul-4-2023; Virginia Jul-4-2023; New York Jul-4-2023; North Carolina Jul-4-2023;
Rhode Island Jul-4-2023; Vermont Jul-4-2023; Kentucky Jul-4-2023; Tennessee Jul-4-2023;
Ohio Jul-4-2023; Louisiana Jul-4-2023; Indiana Jul-4-2023; Mississippi Jul-4-2023;
Illinois Jul-4-2023; Alabama Jul-4-2023; Maine Jul-4-2023; Missouri Jul-4-2023;
Arkansas Jul-4-2023; Michigan Jul-4-2023; Florida Jul-4-2023; Texas Jul-4-2023;
Iowa Jul-4-2023; Wisconsin Jul-4-2023; California Jul-4-2023; Minnesota Jul-4-2023;
Oregon Jul-4-2023; Kansas Jul-4-2023; West Virginia Jul-4-2023; Nevada Jul-4-2023;
Nebraska Jul-4-2023; Colorado Jul-4-2023; North Dakota Jul-4-2023; South Dakota Jul-4-2023;
Montana Jul-4-2023; Washington Jul-4-2023; Idaho Jul-4-2023; Wyoming Jul-4-2023;
Utah Jul-4-2023; Oklahoma Jul-4-2023; New Mexico Jul-4-2023; Arizona Jul-4-2023;
Alaska Jul-4-2023; Hawaii Jul-4-2023;
替换部分使用{...}
大括号包裹的代码块中的 raku 代码来生成替换日期。注意:在识别领域,上面的代码(第二个答案)用于<{%h.values}>
生成月份。您可以使用<alpha>**3
,甚至@GlennJackman 的月份列表(在评论中)。
希普利、塞缪尔. “美国各州加入联邦的日期列表”。大英百科全书,2020 年 2 月 11 日,https://www.britannica.com/topic/list-of-US-states-by-date-of-admission-to-the-Union-2130026。访问日期:2023 年 7 月 4 日。
https://docs.raku.org/type/Date
https://docs.raku.org/routine/mm-dd-yyyy
https://raku.org