Awk如何更改一个单词,但不是每个字母的实例
我编写了一个AWK程序,将Awk如何更改一个单词,但不是每个字母的实例,awk,Awk,我编写了一个AWK程序,将I更改为I,将AWK更改为AWK。它可以工作,但它也会将包含i的每个单词更改为和i。因此写入将更改为写入 我如何将单词I更改为I 这是我的节目: '{gsub(/i/, "I");gsub(/awk/, "AWK");print}' 为此,我认为最好使用sed: $ echo "heilo i aia" | sed -r 's/(\s)i(\s)/\1I\2/g' heilo I aia sed s/hello/bye/g将所有hello替换为bye -r允许使
I
更改为I
,将AWK
更改为AWK
。它可以工作,但它也会将包含i
的每个单词更改为和i
。因此写入
将更改为写入
我如何将单词I
更改为I
这是我的节目:
'{gsub(/i/, "I");gsub(/awk/, "AWK");print}'
为此,我认为最好使用
sed
:
$ echo "heilo i aia" | sed -r 's/(\s)i(\s)/\1I\2/g'
heilo I aia
将所有sed s/hello/bye/g
替换为hello
bye
允许使用简单的-r
捕捉组()
捕获“空格”(制表符,空格…),然后再次捕获字母(\s)i(\s)
和“空格”i
将它们打印回来\1I\2
awk
部件:
$ echo "heilo i aia this awk is awkward" | sed -r -e 's/(\s)i(\s)/\1I\2/g' -e 's/(\s)awk(\s)/\1AWK\2/g'
heilo I aia this AWK is awkward
如果正在使用,则单词边界运算符\y
可用,因此您可以搜索\yi\y
# without \y
$ echo 'i use gawk, which is acronym for gnu awk' | awk '{gsub(/i/, "I");gsub(/awk/, "AWK");print}'
I use gAWK, whIch Is acronym for gnu AWK
# with \y
$ echo 'i use gawk, which is acronym for gnu awk' | awk '{gsub(/\yi\y/, "I");gsub(/\yawk\y/, "AWK");print}'
I use gawk, which is acronym for gnu AWK
通常,正则表达式中的单词边界是\b
,但在gawk中不是:如中所述
这与awk语言将“\b”定义为冲突
退格,因此gawk使用不同的字母。另一种方法
将需要GNU操作符中的两个反斜杠,但是
这被认为太令人困惑了。当前使用“\y”的方法
GNU'\b'似乎是两种邪恶中较小的一种
此功能在中不受支持。如果您使用的是GNU
awk
,它支持egrep
表达式,因此您可能希望使用单词边界\
:
pax> echo "Know that i am alive" | awk '{gsub(/\<i\>/,"I");print}'
Know that I am alive
pax> echo "awk is good to gawk at" | awk '{gsub(/\<awk\>/,"AWK");print}'
AWK is good to gawk at
pax>echo“知道我还活着”{gsub(/\/,“i”);print}
我知道我还活着
pax>echo“awk在”{gsub(/\/,“awk”);print}上呆呆地看着很好”
AWK是一个很好的呆呆的地方
对于这一点,perl可能是一个更好的选择
perl -pe 's/\bi\b/I/g;s/\b\awk\b/AWK/g' your_file
如果您不能使用
gawk
,您可以尝试
{
gsub(/ i /," I ")
sub(/ i$/," I")
sub(/^i $/,"I ")
print
}
我也尝试过使用\<\>但没有成功,因为我使用的是ubuntu 12.04lts。不确定这是否重要。足够简单的修复方法是,确保安装
gawk
或升级到Debian:-)我在一个新的ubuntu 12.04上验证过,但它不起作用:默认awk
由mawk
提供,它的功能比gawk
少。AFAIKmawk
没有单词边界运算符(\
和\y
)。因此有两种选择:安装gawk
以提供更强大的awk
命令,或者使用其他答案中建议的sed
或perl
。