【问题标题】:replace strings in file1 with empty space if strings not found in file2如果在 file2 中找不到字符串,则用空格替换 file1 中的字符串
【发布时间】:2019-12-09 22:51:18
【问题描述】:

本题:https://unix.stackexchange.com/questions/20322/replace-string-with-contents-of-a-file-using-sed将file1中的固定字符串替换为文件2的内容。

我想反过来加上反转。

如果我有 file1:

A:B
B:B
C:
D:
E:A

和文件2:

D
E
:

那我想留下来

:
:
:
D:
E:

如果有人有任何指针,那就太好了。如果可以在文件 1 的特定列上完成此操作,同时保留文件 1 的其余部分,则可以加分。

即如果我有三列:

A:B    A:B    A:B
B:B    B:B    B:B
C:     C:     C:
D:     D:     D:
E:A    E:A    E:A

我最终会得到(目标第 2 列)

A:B    :      A:B
B:B    :      B:B
C:     :      C:
D:     D:     D:
E:A    E:     E:A

【问题讨论】:

  • 我不明白。用什么代替什么? A:B 是否替换为 :?为什么?
  • @KamilCuk A 和 B 被替换为空,即 sed 's/A|B//g',因为这些字符在 file2 中不存在
  • characters ?所以你想从file1中删除file2中的所有字符?你为什么不指定? “替换”部分在哪里?换行符被忽略?哦,您只想在一列上应用删除?所以你想从 file1 的指定列中删除 file2 中的所有字符?
  • 您应该在示例中包含正则表达式元字符,因为这可能会导致潜在的解决方案,特别是如果您包含 ^,因为它需要与所有其他元字符不同地转义才能按字面意思处理。

标签: bash unix awk sed tr


【解决方案1】:

tr 使这变得微不足道:

$ tr -cd "$(cat file2)" < file1         
:
:
:
D:
E:

【讨论】:

    【解决方案2】:
    $ cat tst.awk
    BEGIN { FS=OFS="\t" }
    NR == FNR {
        goodChars[$1]
        next
    }
    {
        goodStr = ""
        for (i=1; i<=length($2); i++) {
            char = substr($2,i,1)
            if (char in goodChars) {
                goodStr = goodStr char
            }
        }
        $2 = goodStr
        print
    }
    
    $ awk -f tst.awk file2 file1
    A:B     :       A:B
    B:B     :       B:B
    C:      :       C:
    D:      D:      D:
    E:A     E:      E:A
    

    以上假设您的输入文件看起来是制表符分隔的,否则只需去掉 BEGIN 部​​分。

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -z 's/\n//g;s/.*/s#[^&]##g/' file2 | sed -f - file1
      

      将 file2 转换为 sed 脚本并针对 file1 运行它。这将连接 file2 中的每个字符并将它们放置在全局运行的 sed 替换命令内的负字符类中,即该命令从 file1 中删除 file2 中所有出现的任何字符。

      为了解决第二个问题,在否定字符类中添加换行符,隔离第二列,制作副本,应用相同的代码并使用模式匹配将第二列替换为修改后的值:

      sed -z 's/\n//g;s/.*/s#[^&\\n]##g/' file2 |
      sed -Ee 's/\S+/\n&\n/2;h' -f - -e 'H;g;s/\n.*\n(.*)\n.*\n(.*)\n/\2\1/' file3
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 2012-04-28
        • 2017-02-19
        • 1970-01-01
        • 2013-02-18
        • 2015-04-16
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        相关资源
        最近更新 更多