我写了一个AWK计划,将i
更改为I
,将awk
更改为AWK
。它有效,但它也会更改包含i
和I
的每个字词。因此writing
将更改为wrItIng
。
如何将单词i
更改为I
?
这是我的计划:
'{gsub(/i/, "I");gsub(/awk/, "AWK");print}'
答案 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
}