我正在尝试替换文本文件中几个不同字符串中的数字。基本上它将采取
的形式tableNameNUMBER
carNUMBER
我对bash和脚本编写很新,我不知道如何用我传入的内容替换NUMBER
。所以我试过这个:
#! /usr/bin/env bash
sed "s/NUMBER/$1/" myScript.txt > test.txt
然后在命令行:
sh test.sh 123456
这只适用于NUMBER
独立的情况,前面没有tableName
或car
。如何在这些情况下替换NUMBER
。拥有${NUMBER}
会更好吗?对不起,如果这些都是noob问题。
答案 0 :(得分:10)
这应该可以正常工作:
sed "s/NUMBER/$1/g" myScript.txt > test.txt
最后的g
允许设置在一行上多次出现时替换NUMBER。
事实上,快速测试:
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”,以及单引号和双引号之间的差异。