【问题标题】:line replace given contexts on two sides of a split行替换拆分两侧的给定上下文
【发布时间】:2016-08-07 17:16:14
【问题描述】:

我正在尝试在拆分的两侧替换给定上下文。这在 python 中似乎更容易做到,但我的整个管道都在 bash 中,所以我很想坚持使用 sed、awk、grep 等工具。

例如:

split_0 = split('\t')[0]
split_1 = split('\t')[1]
if (a b c in split_0 AND w x y z in split_1):
    split_1 = split_1.replace('w x y z', 'w x_y z')

我可以使用 awk 进行这样的拆分:

awk -F '\t' '{print$1}'

但我不知道如何同时在双方执行此操作以满足两个条件。任何帮助将不胜感激。

输入/输出示例: 这是一个例子,我有很多这样的规则,但基本上我想在这里做的是一个例子,左边有“ex”,右边有“ih gz”,我想用ih gz 去 ih g_z。

input: exam    ih g z ae m
output: exam    ih g_z ae m

我可以做一个残酷的 sed 像:

sed 's/\(.*ex.*\t.*\)ih g z\(.*\)/\1ih g_z\2/g' 

但这看起来很难看,我相信有更好的方法来做到这一点。 *我不完全确定 "\t" 是否在 sed 中以这种方式工作。

【问题讨论】:

  • 你能给我们一些输入/输出的例子吗?
  • @Llama 先生,更新了!
  • @Ed Morton 我认为如果我更好地解释这个例子可能会更好。但我认为这个问题很清楚。这不是简单的替换,而是在给定两侧条件的情况下在一侧替换。
  • 不知道为什么我的问题被否决了...

标签: bash awk replace split


【解决方案1】:

awk 来救援!

awk -F'\t' '$1~/ex/ && $2~/ih g z/{sub("g z","g_z")}1' file

字段 1 和 2 的条件由制表符分隔,替换字符串(一次)。

如果你有一堆这样的替换规则,最好不要在脚本中硬编码

    $ awk -F'\t' -v OFS='\t' 'NR==FNR{lr[NR]=$1; rr[NR]=$2; 
                                      ls[NR]=$3; rs[NR]=$4; next}
                                     {for(i=1; i<=length(lr); i++) 
                                         if($1~lr[i] && $2~rr[i])
                                            {gsub(ls[i],rs[i],$2);
                                             print; 
                                             next}}1' rules file

111     2b2b2b
222     333u33u
4       bbb5az
9       nochange

在哪里

$ head rules file
==> rules <==
1       2       a       b
2       3       z       u
4       5       e       b

==> file <==
111     2a2a2a
222     333z33z
4       eee5az
9       nochange

注意到替换将仅针对第二个字段上的第一个适用规则,并且会多次替换。两个文件都需要制表符分隔。

【讨论】:

  • 我喜欢这个。它比我的 sed 好。出于好奇,我怎么能用 awk 否定,我可以使用“^”吗?如果我有冲突,比如我在左侧有前任,我想否定它。
  • $1!~/ex/ 是模式匹配否定。
  • 我注意到一个问题。我有几个替换要做。我可以连接这些子句吗?我考虑过创建 tmp 文件,但这似乎很麻烦,我确信有一种更巧妙的方法。
  • 相同条件下的几个潜艇?将它们链接在 sub();sub();... 块中,对于不同的条件,只需添加其他 condition{action}
  • 我不知道该怎么做。在需要进行替换的上下文 1 和 2 中,我将始终使用相同的分隔符。
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2016-03-07
  • 2013-01-05
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多