Linux 如何用X到Y字符替换字符串

Linux 如何用X到Y字符替换字符串,linux,bash,awk,sed,grep,Linux,Bash,Awk,Sed,Grep,我有以下类似的数据: 2496,8805,1/7/19 18:58,9723308800 7,18538320322,1/7/19 19:22,13012881250 8827,9723308808,1/7/19 19:55,9723308800 3109,8801,1/7/19 19:56,19723308800 我正在寻找替换字段2中字符串的方法。如果数字没有10-11个字符,我想将其替换为12223334444,因此输出为: 2496,12223334444,1/7/19 18:58,9

我有以下类似的数据:

2496,8805,1/7/19 18:58,9723308800
7,18538320322,1/7/19 19:22,13012881250
8827,9723308808,1/7/19 19:55,9723308800
3109,8801,1/7/19 19:56,19723308800
我正在寻找替换字段2中字符串的方法。如果数字没有10-11个字符,我想将其替换为12223334444,因此输出为:

2496,12223334444,1/7/19 18:58,9723308800
7,18538320322,1/7/19 19:22,13012881250
8827,9723308808,1/7/19 19:55,9723308800
3109,12223334444,1/7/19 19:56,19723308800
我最初的想法是使用
cut
获取第二个字段,然后使用
grep“[1-9]”
或类似的方法匹配9个或更少的字符。但是,我很确定有一种更有效的方法可以使用
sed
awk
来实现这一点。任何指导都将不胜感激

awk'BEGIN{FS=OFS=“,”}$2999999999{$2=12223334444}{print}文件
awk 'BEGIN{FS=OFS=","} $2<1000000000 || $2>99999999999 {$2=12223334444} {print}' file
或更短:

awk 'BEGIN{FS=OFS=","} $2<1000000000 || $2>99999999999 {$2=12223334444}1' file
awk'BEGIN{FS=OFS=“,”}$2999999999{$2=12223334444}1文件

awk'BEGIN{FS=OFS=“,”}length($2)11{$2=12223334444}1文件

awk'BEGIN{FS=OFS=“,”}{l=length($2)}l11{$2=12223334444}1文件

awk-F,-vofs=,“{l=length($2)}l11{$2=12223334444}1”文件
输出:

2496 12223334444 1/7/19 18:58 9723308800 7,18538320322,1/7/19 19:22,13012881250 8827,9723308808,1/7/19 19:55,9723308800 3109 12223334444 1/7/19 19:56 19723308800 2496 12223334444 1/7/19 18:58 9723308800 7,18538320322,1/7/19 19:22,13012881250 8827,9723308808,1/7/19 19:55,9723308800 3109 12223334444 1/7/19 19:56 19723308800
请参阅:

这可能适合您(GNU-sed):


如果由
分隔的第二个字段没有10或11个字符,请将该字段替换为
12223334444

另一个
awk

$ awk 'BEGIN{FS=OFS=","} (s=length($2))!=10 && s!=11{$2=12223334444}1' file


切勿使用名为
l
的变量,因为它看起来太像数字
1
(在某些字体中无法区分),因此会不必要地混淆代码。@WalterA恐怕不会。正则表达式与阳性条件n.b.匹配
awk -F, -v OFS=, '{l=length($2)} l<10 || l>11 {$2=12223334444}1' file
2496 12223334444 1/7/19 18:58 9723308800 7,18538320322,1/7/19 19:22,13012881250 8827,9723308808,1/7/19 19:55,9723308800 3109 12223334444 1/7/19 19:56 19723308800
sed -E '/^[^,]*,[^,]{10,11},/!s/[^,]*/12223334444/2' file
$ awk 'BEGIN{FS=OFS=","} (s=length($2))!=10 && s!=11{$2=12223334444}1' file
$ awk 'BEGIN{FS=OFS=","} (s=length($2))<10 || s>11{$2=12223334444}1' file
$ awk 'BEGIN{FS=OFS=","} $2!~/^.{10,11}$/{$2=12223334444}1' file