awk如何更改单词但不是每个字母的实例

时间:2013-11-19 09:17:40

标签: awk

我写了一个AWK计划,将i更改为I,将awk更改为AWK。它有效,但它也会更改包含iI的每个字词。因此writing将更改为wrItIng

如何将单词i更改为I

这是我的计划:

'{gsub(/i/, "I");gsub(/awk/, "AWK");print}'

5 个答案:

答案 0 :(得分:3)

如果您使用的是gawk,则可以使用字边界线运算符\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:如Gawk manual中所述,

  

与awk语言的'\ b'定义冲突   退格,所以gawk使用不同的字母。另一种方法   在GNU运算符中需要两个反斜杠,但是   这被认为太混乱了。目前使用'\ y'的方法   GNU'\ b'似乎是两个邪恶中较小的一个。

mawk不支持此功能。

答案 1 :(得分:3)

如果你使用支持awk表达式的GNU egrep,那么你可能想要使用单词boundary \<\>

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

答案 2 :(得分:2)

我认为最好使用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

答案 3 :(得分:1)

可能perl是更好的选择。

perl -pe 's/\bi\b/I/g;s/\b\awk\b/AWK/g' your_file

答案 4 :(得分:0)

如果您无法使用gawk,可以尝试

{
    gsub(/ i /," I ")
    sub(/ i$/," I")
    sub(/^i $/,"I ")
    print
}