sed 不匹配等号或识别第二个斜杠后的特殊字符

sed does not match equal sign or recognize special characters after the second slash

我是 sed 的新手,对这个问题感到困惑。文本文件中有一行:

 start_year                          = 1952,

我需要用数组中的年份编号替换开始年份编号,比如 time_c=(1999 01 01)

。所以我测试了以下命令:

txt=" start_year                          = 1952,"
echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*=) (.*)/ [:blank:]${time_c[0]}/g'

但这只会返回去除空格的原始行:

start_year = 1952,

似乎 sed 只在我删除等号时才识别模式,因为如果我这样做

echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*) (.*)/ = [:blank:]${time_c[0]}/g'

那么结果就是:

start_year = [:blank:]${time_c[0]}

现在sed好像识别正确了。但是,为什么它不解释 [:blank:] 和我的变量呢?

另一件小事是,如果可能的话,我想在替换文本中保留原始空格。这对我的程序无关紧要,但它使替换的行与其他行更好地对齐。

有人可以帮忙吗?非常感谢!

试试这个

$ time_c=(1999 01 01); echo " start_year                          = 1952," | 
sed -r "s/(\s*start_year\s+=\s*)(.*)(,)/${time_c[0]}/"

 start_year                          = 1999,

Shell 不会在单引号内进行任何类型的替换。

此外,字符 类 是带有双括号的 [[:space:]]。您也可以执行 [^[:space:][:digit:]] 之类的操作(不是 space 或数字)。并且替换文本不希望 [:space:] 出现 — 好吧,很可能它不会

这个有效:

time_c=(1999 01 01)
txt=" start_year                          = 1952,"
echo "$txt" | sed -r 's/([[:blank:]]*start_year[[:blank:]]*=) (.*)/ '"${time_c[0]}"'/g'

请注意 shell 变量的扩展是如何在单引号外和双引号内完成的——这通常是个好主意(单引号外很重要;双引号内是个好主意)。

它产生:

 start_year                          = 1999