【问题标题】:I want to edit a specific lines (multiple) with sed command我想用 sed 命令编辑一个特定的行(多行)
【发布时间】:2018-12-17 04:39:54
【问题描述】:

我有一个测试文件,该文件中有大约 20K 行我想更改特定行中的一些特定字符串我正在获取要更改的行号和字符串。这里我有一个场景,我想将一个字符串更改为另一个在多行。我之前用过像

sed -i '12s/stringone/stringtwo/g'   filename

但在这种情况下,我必须为相同的测试运行多个命令,例如

sed -i '15s/stringone/stringtwo/g'   filename
sed -i '102s/stringone/stringtwo/g'   filename
sed -i '11232s/stringone/stringtwo/g'   filename

比我在下面尝试过的

sed -i '12,15,102,11232/stringone/stringtwo/g' filename

但我得到了错误

sed: -e expression #1, char 5: unknown command: `,'

请有人帮助我实现这一目标。

【问题讨论】:

  • sed 无法使用文字字符串进行操作(请参阅stackoverflow.com/q/29613304/1745001),因此如果您真的想这样做,那么您使用了错误的工具。 edit 您的问题包括简洁、可测试的样本输入和预期输出,并确保包括正则表达式和反向引用元字符(如果可能出现)。

标签: file unix awk sed


【解决方案1】:

要获得您试图通过 GNU sed 获得的功能,在 GNU awk 中应该是这样的:

awk -i inplace '
BEGIN {
    split("12 15 102 11232",tmp)
    for (i in tmp) lines[tmp[i]]
}
NR in lines { gsub(/stringone/,"stringtwo") }
' filename

就像使用 sed 脚本一样,当字符串包含正则表达式或反向引用元字符时,上述操作将失败。如果这是一个问题,那么使用 awk 您可以将 gsub() 替换为 index() 和 substr() 以进行字符串文字操作(sed 不支持)。

【讨论】:

    【解决方案2】:

    您收到错误是因为sed 中的N,M 是一个范围(从NM)并且不适用于单行号列表。

    另一种方法是使用printfsed

    sed -i "$(printf '%ds/stringone/stringtwo/g;' 12 15 102 11232)" filename
    

    printf 语句对参数中的所有数字 N 重复模式 Ns/stringone/stringtwo/g;

    【讨论】:

      【解决方案3】:

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

      sed '12ba;15ba;102ba;11232ba;b;:a;s/pattern/replacement/' file
      

      对于每个地址,分支到一个公共占位符(在本例中为 :a)并进行替换,否则退出 sed 循环。

      如果地址在文件中:

      sed 's/.*/&ba/' fileOfAddresses | sed -f - -e 'b;:a;s/pattern/replacement/' file 
      

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 2015-05-21
        • 2013-06-29
        • 2013-11-04
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        相关资源
        最近更新 更多