例如我有这个输出:
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
更多选择:
Perl 带有标签自动分割功能:
$ perl -F"\t" -lae '$F[1]=substr($F[1],0,10); print join "\t",@F' file string1 anynamever string2 string1 othernamev string2
awk
$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,10)}1' file string1 anynamever string2 string1 othernamev string2
sed
$ sed -E 's/(\S+\t\S{10})[^\t]+/\1/' file string1 anynamever string2 string1 othernamev string2
再来一个 Perl
$ perl -pe 's/(\S+\t\S{10})[^\t]+/\1/' file string1 anynamever string2 string1 othernamev string2