如何在文件中使用字符串匹配替换整个单词

时间:2017-10-10 21:56:09

标签: linux bash unix awk sed

我修改了此处的代码:sed whole word search and replace

我一直在尝试使用正确的语法\<\>来匹配文件中的多个术语。

echo "Here Is My Example Testing Code" | sed -e "$(sed 's:\<.*\>:s/&//ig:' file.txt)"

但是,我认为,因为它正在查看文件,它与完整单词(仅完全匹配)不匹配,只留下一些拆分单词和单个字符。

有谁知道正确的语法?

示例:

输入:

Here Is My Example Testing Code

FILE.TXT:

example
test

期望的输出:

Here Is My Code

2 个答案:

答案 0 :(得分:2)

修改您的sed命令,如下所示,应该提取您想要的内容,

sed -e "$(sed 's:\<.*\>:s/&\\w*\\s//ig:' file.txt)"

简要说明,

  • \b匹配单词和非字母数字字符之间的位置。在这种情况下,模式&#39;测试&#39;在file.txt中不匹配&#39;测试&#39;。
  • 这样,修改附加\w*的搜索模式应该有效。 \w实际上与[a-zA-Z0-9_]
  • 相匹配
  • 并且不要忘记消除每个搜索模式背后的空间,应添加\s

答案 1 :(得分:0)

关注awk可以帮助你。

awk 'FNR==NR{a[$0]=$0;next} {for(i=1;i<=NF;i++){for(j in a){if(tolower($i)~ a[j]){$i=""}}}} 1' file.txt input
***OR***
awk '
FNR==NR{
  a[$0]=$0;
  next
}
{
for(i=1;i<=NF;i++){
  for(j in a){
    if(tolower($i)~ a[j]){
     $i=""}
}}}
1
' file.txt input

输出如下。

Here Is My   Code

此外,如果您的Input_file始终是一个单独的空格分隔,并且您不需要如上面输出所示的不必要的空间,那么您可以使用以下内容。

awk 'FNR==NR{a[$0]=$0;next} {for(i=1;i<=NF;i++){for(j in a){if(tolower($i)~ a[j]){$i=""}}};gsub(/ +/," ")} 1' file.txt input
***OR***
awk '
FNR==NR{
a[$0]=$0;
next
}
{
for(i=1;i<=NF;i++){
 for(j in a){
   if(tolower($i)~ a[j]){
    $i=""}
}};
gsub(/ +/," ")
}
1
' file.txt input

输出如下。

Here Is My Code