简单查找并替换为sed

时间:2012-10-04 20:56:28

标签: bash

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

的形式
tableNameNUMBER
carNUMBER

我对bash和脚本编写很新,我不知道如何用我传入的内容替换NUMBER。所以我试过这个:

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

然后在命令行:

sh test.sh 123456

这只适用于NUMBER独立的情况,前面没有tableNamecar。如何在这些情况下替换NUMBER。拥有${NUMBER}会更好吗?对不起,如果这些都是noob问题。

3 个答案:

答案 0 :(得分:10)

这应该可以正常工作:

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,除非它自己更改,请在\b周围使用NUMBER

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

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

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

答案 1 :(得分:3)

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

您的 shebang 错误

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

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

$ chmod a+x test.sh

然后像这样运行:

$ ./test.sh 123456

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


至于你问的问题,你可以轻松测试你的正则表达式替换:

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

它似乎工作正常。

注意:前面的$仅表示我将其键入我的控制台并且不是实际命令的一部分。

答案 2 :(得分:1)

替换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”,以及单引号和双引号之间的差异。