【问题标题】:sed find and replace fails when string has a space in it当字符串中有空格时,sed 查找和替换失败
【发布时间】:2020-12-02 01:04:42
【问题描述】:

我有一个 sample.txt 文件,内容如下:

test sometest
test2 againsometext

我的 shell 脚本使用 sed 查找包含“test”的行并将整行替换为“test google.com::100-ws sample.com::SAMPLE”。 sed 因“未终止的 `s' 命令”而失败。

#!/bin/sh

TEST1=test
TEST2=google.com::100-ws sample.com::GOLD-WS
echo $TEST1
echo $TEST2

if [[ ! -e sample.txt ]]; then
  touch sample.txt
  echo $TEST1 $TEST2 >> sample.txt
else
  grep -q $TEST1 sample.txt
  if [ $? -eq 0 ];then
     sed -i 's/^$TEST1 .*$/$TEST1 '$TEST2'/' sample.txt
  else
     echo $TEST1 $TEST2 >> sample.txt
  fi
fi

我在替换文本没有任何空格的其他地方也有同样的脚本,它工作正常。

有人可以提出一些想法来尝试吗?

TIA

【问题讨论】:

标签: sed


【解决方案1】:

假设bash 在您的环境中可用,它将只是 足以说:

#!/bin/bash

test1="test"
test2="google.com::100-ws sample.com::GOLD-W"

sed -i "s/^$test1.*/$test1 $test2/" sample.txt
  • 您需要引用包含空白字符的字符串以防止分词。
  • 对普通变量名使用大写字母不是一个好习惯。
  • 您需要使用双引号而不是单引号来启用变量扩展 发给sed的命令。

【讨论】:

  • 这行得通。谢谢!我使用大写因为它们实际上是环境变量。我改名了,因为我不能分享真实姓名。
  • 感谢您的反馈。我明白你为什么选择大写变量名了。
【解决方案2】:

test 和 msg 之间的空间很重要。否则,您将删除以 test 开头的每一行。你也可以反向引用\1你捕获的组\(test \)https://regular-expressions.mobi/refcapture.html

#! /bin/bash
replace="google.com::100-ws sample.com::GOLD-W"
sed -i "s/^\(test \).*/\1$replace/" sample.txt

【讨论】:

  • 感谢您的回复。欣赏!
猜你喜欢
  • 2014-09-05
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2015-09-03
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多