如何在比赛结束后删除一些字符?

如何在比赛结束后删除一些字符?

我有一个包含以下示例内容的文件:

NOF 下跌位 = 96 数据 = 2018 年 1 月 3 日星期三 04:37:32 2018:7E 1 月 3 日星期三 04:37:32 2018:7E 1 月 3 日星期三 04:37:32 2018:7E 2018 年 1 月 3 日星期三 04:37:32: 7E 1月3日星期三04:37:32 2018:7E 1月3日星期三04:37:32 2018:7E 1月3日星期三04:37:32 2018:7E 1月3日星期三04:37:32 2018:7E 1月3日星期三04: 37:32 2018:7E 1月3日星期三 04:37:32 2018:7E 1月3日星期三04:37:32 2018:7E 1月3日星期三04:37:32 2018:7E 2018年1月3日星期三04:37:32:
nof_received_data_packets

我想从文件中删除日期和时间。也就是说,我想删除“Wed Jan 3 XX:XX:XX 2018:”的所有实例。因此,可能会n在每次出现Wedshould 后删除字符。

我将如何实现它sed

答案1

只需匹配模式:

$ sed 's/Wed Jan 3 ..:..:.. 2018://g' FILE
NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 
nof_received_data_packets

可能有更复杂的方法来编写它,但它确实有效。

答案2

awk:

awk -v RS='[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}:' \
    -v ORS='' '{print}'  datafile

NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 
nof_received_data_packets

这是通过将记录分隔符 (RS) 设置为与看起来像日期和时间后跟 的字符串匹配的正则表达式:,并将输出记录分隔符 (ORS) 设置为空来实现的。

然后它只打印每个“记录”。

它适用于任何日期和时间,仅假设短月份名称和短日期名称始终为三个字母长,并且日期格式始终为Day Month Daynum HH:MM:SS YYYY.

sed:

sed -E 's/[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}://g' \
  datafile

这使用相同的日期匹配正则表达式来删除所有看起来像日期和时间后跟:.

珀尔:

perl -p -e 's/\w{3} \w{3} \d{1,2} (\d{2}:?){3} \d{4}://g' datafile

Perl 正则表达式有一些很好的快捷方式来指定“单词”字符 ( \w) 和数字 ( \d)。 Perl 版本支持 unicode,并且可以在任何语言环境中工作。

这三个脚本都是相当暴力的脚本。我认为不值得尝试比这更奇特的东西,除非日期格式可能与上面的有所不同。如果是这样的话,我可能会在 perl 中编写一些东西来使用该Date::Parse模块扫描每行的子字符串。

sed和版本awk需要 GNUsed和 GNU awk,或者至少需要它们的能够理解{n,m}正则表达式重复计数的版本。

相关内容