【问题标题】:Simple find and replace with sed用 sed 简单查找和替换
【发布时间】:2016-11-09 19:52:52
【问题描述】:

我正在尝试替换文本文件中几个不同字符串中的数字。基本上它会采用

的形式
tableNameNUMBER
carNUMBER

我对 bash 和脚本很陌生,我不知道如何用我传入的内容替换 NUMBER。所以我尝试了这个:

#! /usr/bin/env bash
sed "s/NUMBER/$1/" myScript.txt > test.txt

然后在命令行:

sh test.sh 123456

这仅适用于 NUMBER 单独存在且前面没有 tableNamecar 的情况。在这些情况下,我该如何替换 NUMBER。有${NUMBER} 会更好吗?对不起,如果这些完全是菜鸟问题。

【问题讨论】:

  • 应该可以。也许您只需要添加 g 标志:sed "s/NUMBER/$1/g"
  • 离题:为什么你在sh 脚本中有一个bash shebang 行,你还使用sh test.sh 显式运行它?
  • 另外,NUMBER 是一个实际的字符串,还是一个实际的数字?
  • 试试:#1 /usr/bin/env bashsed "s/(tableName\|car)NUMBER/\1$1/g" myScript.txt > test.txt

标签: bash


【解决方案1】:

这应该可以正常工作:

sed "s/NUMBER/$1/g" myScript.txt > test.txt

末尾的g 允许设置替换NUMBER,如果它在一行上出现多次。

其实快速测试一下:

foo.txt

carNUMBER
tableNameNUMBER
NUMBER
NUMBERfoo

$ NUMBER=3.14
$ sed "s/NUMBER/$NUMBER/g" foo.txt
car3.14
tableNumber3.14
3.14
3.14foo

这不是你的sed 命令在做什么吗?

如果您想确保不要更改 NUMBER,除非它是单独的,请在 NUMBER 周围使用 \b

$ sed "s/\bNUMBER\b/$NUMBER/g" foo.txt
carNumber
tabelNumberNUMBER
3.14
NUMBERfoo

如果您不关心字符串NUMBER 的大小写,请在sed 命令的末尾加上i

$ sed "s/NUMBER/$NUMBER/gi" foo.txt

【讨论】:

    【解决方案2】:

    既然你说你是新手,我要先回答一些你没有问过的问题。

    你的shebang错了

    脚本的第一个字节应该是#!(哈希和感叹号;称为shebang)。你有#1(hash-one),这是胡言乱语。这个 shebang 行告诉系统在执行时使用bash 来解释您的文件(即您的脚本)。 (或多或少。从技术上讲,它实际上是给env,它在移交之前找到bash。)

    一旦你修复了 shebang,设置脚本的权限,让系统知道它是可执行的:

    $ chmod a+x test.sh
    

    然后像这样运行它:

    $ ./test.sh 123456
    

    正如@gokcehan 还评论的那样,当你有一个 shebang 时使用sh ... 运行你的脚本是多余的,并且由于其他原因不是可取的。


    至于您的要求,您可以轻松测试您的正则表达式替换:

    $ echo tableNameNUMBER | sed "s/NUMBER/123456/"
    tableName123456
    

    而且它似乎工作得很好。

    注意:前面的$ 仅表示我在控制台中输入了它,而不是实际命令的一部分。

    【讨论】:

      【解决方案3】:

      要将 1111 替换为 2222,您可能应该尝试

      cat textfile.txt | sed -e 's/1111/2222/g'
      

      cat textfile.txt | sed -e 's/1111/2222/g' > output.txt
      

      NUMBER=1111 ; NEWNUMBER=2222; cat textfile.txt | sed -e "s/$NUMBER/$NEWNUMBER/g"
      

      无需为此类琐碎的任务创建单独的脚本。注意 sed 的“-e”开关,在引号命令末尾附加“g”,以及单引号和双引号的区别。

      【讨论】:

      • 无需使用 cat: sed -e s/1111/2222/g textfile.txt` 会做同样的事情。
      猜你喜欢
      • 2020-08-05
      • 2020-06-24
      • 2021-10-06
      • 1970-01-01
      • 2016-04-27
      • 2019-11-29
      • 2011-08-24
      • 2020-02-03
      • 2012-06-09
      相关资源
      最近更新 更多