簡體   English   中英

匹配sed中的特殊字符

[英]Matching special characters in with sed

我有一個帶有以下行的文件。 我的目標是用**掩蓋諸如名稱,DOB,電子郵件地址,郵寄地址,居住地址,電話號碼,其他電話號碼等字段的值。 棘手的是,在下一個字段開始之前,文本可能沒有可預測的長度。 例如,城市的終點和州的起點..也許用*知道終點? 我正在使用.sed文件,並針對此日志文件運行它。 “ |” 也是文件的一部分。 它基本上是一個輸出到日志文件中的屏幕

    -------------------------------------------------------------------------- --------
    | XXX XX Requested function key not allocated.                                  |
    |     ***** System *****                                                         |
    |                           - Maintain  -              11:55 AM                  |
    | < 1 more  P                                                           3 more > |
    | *Action (A,D,M): _                                                                      |
    |  Office Number: 14                                                             |
    | Case ID:    XXXXXXXXX    Email Address: ___________________________________    |
    | Name: TWENTYFIFTEE MAYSEVEN          DOB: 11111950  *Correspondence Lang: _    |
    |                            Street One                    Street Two            |
    | Mailing Address....: 7 MAY____________________    _________________________    |
    | City...............: DALLAS_________ *State: TX Zip Code: 75062 - ____         |
    |                                                                                |
    | Residential Address: 7 MAY____________________    _________________________    |
    | City...............: DALLAS_________ *State: TX Zip Code: 75062 - ____         |
    | Phone Number...:( ___ ) ___ - ____    Other Phone Number:( ___ ) ___ - ____    |
    | Authorized Rep                     Last      TTL   First   MI                  |
    |                              Name........: ____________ ___ _________ _        |
    | Authorized Representative Phone Number: ( ___ ) ___ - ____                     |
    | Last Updt Dttm......: 05/07/2015 11:55:01 AM   Last Update User: JU14          |
    |                         XXXXXX               XXXXXX                            |
    |                                                                                |
    ----------------------------------------------------------------------------------

所以也許用*知道終點?

我不確定這是否是一個好方法。 似乎並非所有字段都帶有* ,但這並不涵蓋字段值中帶有*的情況。

假設您只可以用*字符替換整個字段,那么我會將其分成多個sed命令(每個要替換的字段一個)。

它還需要一些手工工作; 在這里,我們替換了幾乎所有類型的30個字符. 包含30個*字符,因為這是“名稱”值字段包含的字符數。

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

這對您的第9行的影響是

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

使用分隔符的情況下

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循環條目中通過由1個定界符,后跟<->和結束定界符組成的字符串定義。
    • 我在這段代碼中添加了3個示例
    • 您可以使用其他字符序列作為分隔符之間的分隔符,但結果會修改sed部分(實際上${Balise...}<->
  • sed將通過*遞歸更改2個定界符之間的字符
  • 您可以對GNU sed使用-i選項來代替此處用於任何版本的臨時文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM