【发布时间】:2020-09-21 06:05:00
【问题描述】:
我正在尝试使用 awk 在 Arch mkinitcpio.conf 中安排一些条目。 我想出了一个可行的解决方案,但老实说这让我有点恶心,所以我想知道,一定有更好的方法来实现这样的目标,对吧?
文件中的某处基本上有这样一行:
HOOKS=(base udev autodetect modconf block filesystems keyboard fsck)
我想重新排列它,以便块和键盘在自动检测之前出现。
#! /usr/bin/awk -f
/^\s*HOOKS/ {
start_list = index ($0, "(" ) + 1
end_list = index ($0, ")" )
l = end_list - start_list
listo = substr($0, start_list, l)
split(listo, arr, " ")
j = 1
for (i in arr)
{
if (arr[i] == "keyboard" || arr[i] == "block")
{ }
else if (arr[i] != "autodetect")
juck[j++] = arr[i]
else
{
juck[j++] = "keyboard"
juck[j++] = "block"
juck[j++] = arr[i]
}
}
for (k in juck)
print juck[k]
}
根据 cmets 中的请求:期望的结果是这样的一行:
HOOKS=(base udev keyboard block autodetect modconf filesystems fsck)
【问题讨论】:
-
请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
-
块、键盘和自动检测是否总是会出现在该列表中?
-
嗯,不确定。我实际上不知道 Arch 人员保持这些(默认)配置的格式有多稳定。就问题而言,是的。我想更好的方法是只注释掉默认行并逐字输入我想要的行。
-
如果
gsub(/\s*\<(keyboard|autodetect)\>\s*/," "); sub(/\<block\>/,"keyboard block autodetect")不是您所需要的,那么edit 您的问题可以提供更具代表性的样本输入/输出。 -
嗯,是的,这基本上就是我正在寻找的那种东西。非常感谢。如果你想把它写成一个简短的答案,我很乐意接受。实际上,我花了大约十五分钟试图弄清楚转义尖括号的用途 - 据我所知,它们是标记单词边界的 bash 功能,显然它们对于脚本的功能并不是绝对必要的,对吗? ?