用sed匹配特殊字符

时间:2015-05-27 04:36:31

标签: regex sed

我有一个包含以下行的文件。我的目标是掩盖字段的值,如姓名,DOB,电子邮件地址,邮寄地址,住址,电话号码,其他电话号码**。棘手的部分是,在下一个字段开始之前可能没有可预测的文本长度。例如,城市结束并且州开始......所以也许用*来知道终点?我正在使用.sed文件并针对此日志文件运行它。 “|”也是文件的一部分。它基本上是一个输出到日志文件的屏幕

android{
    dexOpts{
            javaMaxHeapSize "2g"
    }
}

2 个答案:

答案 0 :(得分:1)

  

所以也许用*来知道终点?

我不确定这是不是一个好方法。似乎并非所有字段都跟有*,并且这不包括字段值中包含*的情况。

假设您只能用*个字符替换整个字段,我会将其分解为多个sed命令(每个字段对应一个要替换的字段)。

还需要一些手工操作;在这里,我们用30个.字符替换几乎任何类型*的30个字符,因为这是“name”值字段有多少个字符。

name_len=30
sed -r "s/(Name: ).{,$name_len}/\1$(printf '*%.0s' {1..$name_len})/g"

这对你的第9行的影响是

| Name: ****************************** DOB: 11111950  *Correspondence Lang: _    |

答案 1 :(得分:1)

它使用分隔符

的个案选项
for Balise in '| Name: <-> DOB:' ' DOB: <->   |' ' Email Address: <->   |' 
 do
   sed ":cycle
      s/\(${Balise%<->*}[*]*\)[^*]\(.*${Balise#*<->}\)/\1*\2/
      t cycle" YourFile > TempFile
   mv TempFile YourFile
 done
  • 每次更改使用2个分隔符。每个更改分隔符都在for in循环条目中通过由第一个分隔符后跟<->和结束分隔符组成的字符串定义。
    • 我在此代码中添加了3个样本
    • 您可以使用其他字符序列作为分隔符之间的分隔符,但结果会调整sed部分(事实上<->中的${Balise...}
  • sed将按*
  • 递归更改2个分隔符之间的字符
  • 您可以在GNU sed中使用-i选项代替此处用于任何版本的临时文件