【问题标题】:UNIX: How to search and replace a string with a function of itselfUNIX:如何使用自身的函数搜索和替换字符串
【发布时间】:2012-06-27 13:08:18
【问题描述】:

我有一个包含要加密的字符串的文本文件。这些字符串由标签表示。

例子:

This is an <tag> example </tag>.

在 UNIX 中(使用 sed、bash 等常用工具)搜索所有出现并同时用加密值替换它的最佳方法是什么(这是标签内字符串的函数) ?

结果:

This is an <tag> <encrypted value here> </tag>.

提前致谢!

【问题讨论】:

  • 为什么每次我修复格式时你都要重新编辑你的问题???
  • 你忽略了&lt;space&gt;example&lt;space&gt;周围的空格吗?
  • @khachik 我不知道您正在修复格式。我试图自己修复它
  • @kev uhm,你指的是格式吗?
  • 你想加密空格还是忽略它们?

标签: bash unix sed awk


【解决方案1】:

假设四个不清楚的条件:

  1. 开始和结束标记不必在同一行。
  2. 加密功能的改变不是微不足道的。
  3. 标签只有一种。
  4. 没有任何嵌套。

在这种情况下,bash、sed、awk 都可能过于繁琐。你最好使用 Perl 或 Python。下面是一个算法:

  1. 将 tag_flag 初始化为 0。
  2. 逐字(或逐行,分割每一行)读取文件。
  3. 当 tag_flag 为 0 并且您没有遇到开始标签时,按原样输出所有内容。
  4. 当您遇到开始标签时,将 tag_flag 设置为 1。继续逐字阅读以收集到 to_be_encrypted 字符串。
  5. 遇到结束标签时,在 to_be_encrypted 上打印加密函数的输出,并将 tag_flag 设置为 0。

【讨论】:

    【解决方案2】:

    好的,我几天前就找到了解决方案。 我使用了 bash 和正则表达式。

    我是这样做的:

    #!/bin/bash
    
    REGEX='^(.*<tag>)(.*)(<\tag>.*)$'
    
    function process()
    {
       RESULT= #do processing of $1 here
    }
    
    while read line ; do
       while [[ $line =~ "$REGEX" ]] ; do
          process "${BASH_REMATCH[2]}"
          line="${BASH_REMATCH[1]}$RESULT${BASH_REMATCH[3]}"
       done
       echo "$line" > "$OUTPUT_FILE"
    done < "$FILE"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      相关资源
      最近更新 更多