安全地运行几个字符串替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全地运行几个字符串替换相关的知识,希望对你有一定的参考价值。

我必须在文本文件上运行许多替换,并且我需要区分已经用相同字符串写入的字符串(如果它原来在那里)。

例如,假设我想用a替换b,并在以下文件的第二个字段中用b替换c(以获取b c c

a a
a b
b c

如果我运行awk '$2 == "a" {$2 = "b"}; $2 == "b" {$2 = "c"} 1' file显然我得到了

a c
a c
b c

我可以关注我在这里进行替换的顺序,但实际上不是真实情况。我想有一个灵活的脚本,我可以按任何顺序编写替换,而不必担心被覆盖的值。我试过一个乐观的awk '$2 == "a" {$2 = b}; $2 == "b" {$2 = c}; b = "b"; c = "c"; 1' file,但它不起作用。

答案

因为你最多只想进行一次替换,所以最好使用if ... else if ...

awk '{
    if      ($2 == "a") {$2 = "b"}
    else if ($2 == "b") {$2 = "c"}
    else if ($2 == "c") {$2 = "a"}
    print
}' <<END
a a
a b
b c
END
a b
a c
b a

格式化代码以适合您的风格。


另一种可能更优雅的方法:

awk '
    BEGIN {repl["a"] = "b"; repl["b"] = "c"; repl["c"] = "a"}
    $2 in repl {$2 = repl[$2]}
    1
' <<END
a a
a b
b c
END
另一答案

不更改刚才更改的字符串的一般惯用方法是将旧值映射到输入中不会出现的字符串,然后将这些字符串转换为新值:

$ cat tst.awk
BEGIN {
    old2new["a"] = "b"
    old2new["b"] = "c"
}
{
    # Step 1 - put an "X" after every "@" so "@<anything else>"
    # cannot exist in the input from this point on.
    gsub(/@/,"@X",$2)

    # Step 2 - map "old"s to intermediate strings that cannot exist
    c=0
    for (old in old2new) {
        gsub(old,"@"c++,$2)
    }

    # Step 3 - map the intermediate strings to the new strings
    c=0
    for (old in old2new) {
        gsub("@"c++,old2new[old],$2)
    }

    # Step 4 - restore the "@X"s to "@"s
    gsub(/@X/,"@",$2)

    # Step 5 - print the record
    print
}

$ awk -f tst.awk file
a b
a c
b c

我使用gsub()s这是最常见的应用,但如果这更适合您的情况,请随意使用ifs。

显然,只需在c++末尾添加连接@的方法仅适用于多达10次替换,你必须提供一个映射到其他角色的更多(这是微不足道的,但只是不要跳过RE元字符)。

以上是关于安全地运行几个字符串替换的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串

几个非常实用的JQuery代码片段

如何在运行时用 ChildFragmentManager 和没有 PagerSlidingTabStrip Xamarin.Android 标题的片段替换片段

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

根据字符串名称而不是列表视图项位置替换片段并启动活动

替换的片段仍然可见