我一直在环顾四周,但无法通过 AWK 和 SED 找到办法。 我想知道是否有一种方法可以在单个命令中替换字符串的开始和结束。
更具体地说,其中有一个包含大量单词的文件,我想在之前添加这个单词并在之后添加 / strong>这个词。
谢谢, 罗伊
答案 0 :(得分:2)
因为您说: 更具体地说,有一个包含大量单词的文件,我想在单词之前和之后添加一些内容。
您唯一需要的是$&
与自身匹配。因此,您只需编写您想要的任何内容,只需 之前和结束。而已。
例如说你有这个文件:
this is line 1.
this is line 2.
this is line 3.
我测试了 perl:
perl -lne 'print "beginning->", $&, "<-end" if /.+/g' file
输出是:
beginning->this is line 1.<-end
beginning->this is line 2.<-end
beginning->this is line 3.<-end
愿你只想匹配一个单词,所以这仍然是一个很好的解决方案,例如:
perl -lne 'use English; print "$PREMATCH", "[$MATCH]","$POSTMATCH" if /line/g' file
在此我匹配line
并将其放在一边:[
然后$&
然后]
输出
this is [line] 1.
this is [line] 2.
this is [line] 3.
注意强>
正如您所看到的,您只需要 prematch 和匹配以及匹配。我为您测试了 perl ,如果您对 Perl 感兴趣,可以使用它,或者您可以使用 Sed 或 awk中即可。由于您没有特定的示例,我使用 Perl 进行了测试。
答案 1 :(得分:0)
如果您想用标记包装特定单词,可以在替换字符串中使用&
来实现您想要的效果。
例如,在每次出现单词bird时都放置方括号:
$ echo "hello bird, are you really a bird?" | sed "s/\bbird\b/[&]/g"
hello [bird], are you really a [bird]?
答案 2 :(得分:0)
在单个命令中替换字符串的开始和结束
我们假设我们有一个带有行的测试文件:
tag hello, world tag
要用尖括号tag
括起每个< ... >
字词,我们可以申请:
gsub()
函数awk 进场:
awk '{ gsub(/\<tag\>/, "<&>"); print}' test_file
单词边界\<
,\>
可能因awk实现而异[/ p>
sed 方法:
sed 's/\btag\b/<&>/g' test_file
输出(两种方法):
<tag> hello, world <tag>