![使用正则表达式和 bash perl 将文本替换为部分文本](https://linux22.com/image/933604/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%92%8C%20bash%20perl%20%E5%B0%86%E6%96%87%E6%9C%AC%E6%9B%BF%E6%8D%A2%E4%B8%BA%E9%83%A8%E5%88%86%E6%96%87%E6%9C%AC.png)
例如我有这个输出:
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