【发布时间】:2015-03-24 11:54:39
【问题描述】:
我有多个表单文件
version 'aaa'
other 'bbb'
another 'ccc'
version 'ddd'
onemore 'eee'
有的有一个version,有的有多个;与其他键相同,但值从不重复。作为更大的 bash 函数的一部分,我正在使用 perl 单行代码来修改值
modify_value() {
key_to_modify="$1"
new_value="$2"
perl -i'' -pe "s|^(\s*)${key_to_modify} .*|\1${key_to_modify} ${new_value}|" "${file}"
}
行上的缩进各不相同且不可预测,但应予以尊重(因此需要^(\s*))。这个功能在一定程度上很好用。我可以的
modify_value "onemore" "fff"
并且它将在文本文件中正确替换。但是,它发生故障的地方是我有多个具有相同名称的键(例如前面提到的version),因为这种更改将在所有键中进行。在我的特殊情况下,我希望在最后一种情况下始终进行修改。
由于值从不重复,所以到目前为止我所拥有的是
modify_value() {
key_to_modify="$1"
new_value="$2"
last_key=$(cat "${file}" | grep "^\s*${key_to_modify}" | tail -1 | perl -pe 's/^\s*//')
perl -i'' -pe "s|^(\s*)${last_key}|\1${key_to_modify} ${new_value}|" "${file}"
}
这可行,但有点不雅。是否可以利用 perl 单行代码仅对最近发生的匹配进行操作?
【问题讨论】:
-
你的文件有多大?
-
不大。至少 11 行,但不应超过 90 行。
-
取决于你的线条有多宽,这是一个小文件