我对sed还不熟悉,对这个问题感到困惑。文本文件中有一行:

 start_year                          = 1952,

我需要用数组中的年份替换起始年份编号,例如time(1999 01 01)
. 所以我测试了以下命令:
txt=" start_year                          = 1952,"
echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*=) (.*)/\1 [:blank:]${time_c[0]}/g'

但这只会把原来的一行去掉空白:
start_year = 1952,

似乎sed只在我去掉等号的情况下识别模式,因为如果我去掉等号的话
echo "$txt" | sed -r 's/([:blank:]*start_year[:blank:]*) (.*)/\1 = [:blank:]${time_c[0]}/g'

结果是:
start_year = [:blank:]${time_c[0]}

现在sed似乎已经正确地认识到了。但是,为什么它不解释[:blank:]和我的变量?
另一个小问题是,如果可能的话,我希望保留替换文本中的原始空白。这对我的程序来说并不重要,但它可以使替换的行与其他行更好地对齐。
有人能帮忙吗?谢谢!

最佳答案

shell不在单引号内进行任何形式的替换。
此外,字符类是带双括号的[[:space:]]。你也可以做像[^[:space:][:digit:]]这样的事情(不是空格或数字)。替换文本不希望[:space:]出现-嗯,很可能它不希望
这是有效的:

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

注意shell变量的扩展是如何在单引号外和双引号内完成的——这通常是一个好主意(单引号外至关重要;双引号内是个好主意)。
它产生:
 start_year                          = 1999

10-01 04:04
查看更多