Bash 如何使用sed测试并编辑一行输入?

Bash 如何使用sed测试并编辑一行输入?,bash,shell,sed,Bash,Shell,Sed,我想测试一个电话号码是否有效,然后使用脚本将其转换为不同的格式。到目前为止,我可以这样测试数字: sed -n -e '/(0..)-...\s..../p' -e '/(0..)-...-..../p' 然而,我不只是想测试数字并输出它,我想删除括号、破折号和空格并输出它 使用sed有什么方法可以做到这一点吗?或者我应该使用其他东西,比如AWK?这个建议取决于您的号码格式,例如,我假设电话号码是这样的 echo "(703) 234 5678" | awk ' { for(i=1;i<

我想测试一个电话号码是否有效,然后使用脚本将其转换为不同的格式。到目前为止,我可以这样测试数字:

sed -n -e '/(0..)-...\s..../p' -e '/(0..)-...-..../p'
然而,我不只是想测试数字并输出它,我想删除括号、破折号和空格并输出它


使用sed有什么方法可以做到这一点吗?或者我应该使用其他东西,比如AWK?

这个建议取决于您的号码格式,例如,我假设电话号码是这样的

echo "(703) 234 5678" | awk '
{
 for(i=1;i<=NF;i++){
    gsub(/\(|\)/,"",$i)    # remove ( and )
    if ($i+0>=0  ){ # check if it more than 0 and a number
        print $i
    }
    if (){
       # some other checks
    }
 }
}
'
echo”(703)234 5678“awk”
{
对于(i=1;i=0){#检查它是否大于0和一个数字
打印$i
}
如果(){
#其他一些支票
}
}
}
'

系统地做,你就不必浪费时间精心设计复杂的正则表达式。这个建议取决于你的号码格式,例如,我假设电话号码是这样的

echo "(703) 234 5678" | awk '
{
 for(i=1;i<=NF;i++){
    gsub(/\(|\)/,"",$i)    # remove ( and )
    if ($i+0>=0  ){ # check if it more than 0 and a number
        print $i
    }
    if (){
       # some other checks
    }
 }
}
'
echo”(703)234 5678“awk”
{
对于(i=1;i=0){#检查它是否大于0和一个数字
打印$i
}
如果(){
#其他一些支票
}
}
}
'

系统地做,你就不必浪费时间精心设计复杂的正则表达式了,我不知道你为什么要在这个位置上使用
0
。您在区号位置说“零后跟任意两个字符”。你真的是这个意思吗

无论如何,您希望将sed与
p
命令与
-n
开关结合使用。这里有一种方法:

sed -n 's/(\([0-9][0-9][0-9]\))\s\?\([0-9][0-9][0-9]\)[- ]\([0-9][0-9][0-9][0-9]\)/\1\2\3/p'

我不知道你为什么在那个位置使用
0
。您在区号位置说“零后跟任意两个字符”。你真的是这个意思吗

无论如何,您希望将sed与
p
命令与
-n
开关结合使用。这里有一种方法:

sed -n 's/(\([0-9][0-9][0-9]\))\s\?\([0-9][0-9][0-9]\)[- ]\([0-9][0-9][0-9][0-9]\)/\1\2\3/p'

您还可以使用像
egrep
这样简单的方法来验证行,并
tr
删除您不想看到的字符:

egrep "\([0-9]+\)[0-9.-]+" <file> |tr -d '()\-'
白鹭“\([0-9]+\)[0-9.-]+”|tr-d'()\-'
请注意,只有当您不想保留这些字符时,它才会起作用。

您还可以使用像
egrip
这样简单的方法来验证行,并
tr
删除您不想看到的字符:

egrep "\([0-9]+\)[0-9.-]+" <file> |tr -d '()\-'
白鹭“\([0-9]+\)[0-9.-]+”|tr-d'()\-'
请注意,只有当您不想保留这些字符时,它才会起作用。

这是乔纳森·范伯格(Jonathan Feinberg)回答的更简洁版本。它使用扩展正则表达式来避免执行大括号所需的所有转义(除了将括号的转义从特殊转义移到文字转义之外)


这是乔纳森·范伯格(Jonathan Feinberg)回答的更简洁的版本。它使用扩展正则表达式来避免执行大括号所需的所有转义(除了将括号的转义从特殊转义移到文字转义之外)


是的,区号是南非的:P我只是用任何字符来测试银行。对特定格式进行了一些调整,效果非常好。我是“用乐器飞行”,所以我很高兴它起作用了我不得不避开你BRE版本上的问号。你不用它行吗?是的,区号是南非的:P我只是用任何字符来测试银行。对特定格式进行了一些调整,效果非常好。我是“用乐器飞行”,所以我很高兴它起作用了我不得不避开你BRE版本上的问号。它对你有用吗?