【问题标题】:Find and replace punctuation character in first column for multiple text files在多个文本文件的第一列中查找和替换标点符号
【发布时间】:2011-10-28 13:12:34
【问题描述】:

需要与本文 (Find and replace a particular term in multiple files) 类似的解决方案,但要在每个分隔制表符文本文件的第一列中替换标点符号。

例子:

file1.txt
afile2.txt
3file.txt
...

所有其他文件名都以 .txt 结尾

txt 文件的格式在列之间有一个“制表符”,如下所示:

aaaa:bbb    second_column    third_column
w:xyz    another_second_column    another_third_column

我需要将第一列中的: 替换为另一个字符,例如##

请帮忙。

perl 是否将: 字符视为列切割器?

【问题讨论】:

  • 根据你的 cmets,我感觉你在问The Wrong Question。为什么要删除冒号?它不是 perl 中的元字符。

标签: perl replace punctuation


【解决方案1】:

将一行中第一个制表符分隔列中的第一个冒号替换为##

perl -i.bak -pe's/^([^\t:]*):/$1##/' *.txt

它处理当前目录中的所有 .txt 文件,将备份版本保存到 .bak 文件中。

这是一个不需要捕获的变体(由 cmets 中的@Brad Gilbert 建议):

perl -i.bak -pe's/^[^\t:]*\K:/##/' *.txt

两个脚本产生相同的结果。

【讨论】:

  • s/:/##/ 就足够了。但是 +1。
  • 只要有“:”字符,我就会将第一列截断。这就是为什么我需要更换。 ":" 在 perl 中有什么作用?是的,^\t 将保持第 2 列和第 3 列不变。
  • @M42: 如果第一列没有: 那么s/:/##/ 是错误的。
  • @horkust:构建一个最小的示例来演示您的问题(使用最小的输入、处理它的代码、预期的输出以及您得到的结果)和post it as a question
  • perl -i.bak -pe's/^[^\t:]*\K:/##/' *.txt 适用于更新版本的 Perl
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 2011-07-29
  • 2013-12-26
  • 2014-01-14
  • 2020-06-22
  • 2020-09-25
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多