使用正则表达式和 bash perl 将文本替换为部分文本

使用正则表达式和 bash perl 将文本替换为部分文本

例如我有这个输出:

string1 anynameveryveryverylong string2
string1 othernameveryveryverylong   string2

我想将名字截断为前十个字符:

string1 anynamever  string2
string1 othernamev  string2

伪正则表达式可以是:

perl -pe "s/([^\t]+\t)([^\t]+)\t/\1\2{10}\t/g"

我如何得到它?

答案1

perl -pe 's/^(\S+\s+)(\S{10})\S*/$1$2/'
  • ^匹配字符串的开头
  • \S表示非空白
  • +方法至少重复一次
  • \s表示空格
  • {10}方法重复10次

即保留第一个单词和下一个单词的前 10 个字符,同时忘记第二个单词的其余字符。

您的伪正则表达式有一个实质性问题:{10}放在替换部分,但替换只是一个字符串。正则表达式只发生在模式部分。

答案2

更多选择:

  1. Perl 带有标签自动分割功能:

    $ perl -F"\t" -lae '$F[1]=substr($F[1],0,10); print join "\t",@F' file 
    string1  anynamever  string2
    string1  othernamev  string2
    
  2. awk

    $ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,10)}1' file 
    string1  anynamever  string2
    string1  othernamev  string2
    
  3. sed

    $ sed -E 's/(\S+\t\S{10})[^\t]+/\1/' file 
    string1  anynamever  string2
    string1  othernamev  string2
    
  4. 再来一个 Perl

    $ perl -pe 's/(\S+\t\S{10})[^\t]+/\1/' file 
    string1  anynamever  string2
    string1  othernamev  string2
    

相关内容