如何使用Linux Shell脚本更改文件中的单词

7

我有一个文本文件,里面有很多行。 其中有一行是: MyCar on

我该如何关闭我的车?

5个回答

15

你可以使用sed:

sed -i 's/MyCar on/MyCar off/' path/to/file

我了解过sed,但对于一个非英语人士来说,理解起来很困难。 - Behnam Safari
1
@BehnamSafari,别担心,对于以英语为母语的人来说,使用它也很困难。如果你能够理解“行噪声”,那么你已经领先了。但是说真的,sed非常棒。 - ghoti
@ghoti: 太对了! 顺便说一下,你的链接已经失效了,但是这里有一个关于 sed 的很棒的介绍。 - user5395338
1
@Seamus,嗯,我发表那条评论已经8年多了,人们必须预料到一些变动。感谢您发布这个介绍。这里是Towers of Hanoi的最后一个捕获链接。 - ghoti
1
@ghoti:是的 - SO正在变成博物馆。我想知道URL的平均寿命是多少?汉诺塔很有趣!我不知道它被称为那个名字。我在小孩子时候 - 大概5或6岁的时候 - 收到了一个生日礼物,但它是用木头做的而不是sed :) - user5395338

1

你可以仅使用 shell 来完成此操作。此示例对于这个特定示例使用了一个不必要的 case 语句,但我包含它是为了展示如何结合多个替换。虽然代码比 sed 1-liner 更大,但通常更快,因为它仅使用 shell 内置命令(对于小文件可高达 20 倍)。

REPLACEOLD="old"
WITHNEW="new"
FILE="tmpfile"
OUTPUT=""
while read LINE || [ "$LINE" ]; do
    case "$LINE" in
        *${REPLACEOLD}*)OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
";;
        *)OUTPUT="${OUTPUT}${LINE}
";;
    esac
done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"

对于简单情况,可以省略 case 语句:

while read LINE || [ "$LINE" ]; do
    OUTPUT="${OUTPUT}${LINE//$REPLACEOLD/$WITHNEW}
"; done < "${FILE}"
printf "${OUTPUT}" > "${FILE}"

注意:...|| [ "$LINE" ]... 这一部分是为了防止丢失不以新行结尾的文件的最后一行(现在你至少知道为什么你的文本编辑器会添加这些内容)。

1

0

使用sed与变量;

host=$(hostname)
se1=$(cat /opt/splunkforwarder/etc/system/local/server.conf | grep serverName)
sed -i "s/${se1}/serverName = ${host}/g"  /opt/splunkforwarder/etc/system/local/server.conf`

0

当你在文件内时,请尝试使用以下命令:

:%s/old test/new text/g


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接