文件中groupAfiles.txt包括以下行:

file14
file2
file4
file9

我需要一种方法来将它们转换为删除file和添加/dev/loop,并将它们放在一行中,并且它们之间有一个空格。

/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9

然后我需要将其放入数组中。

(但数字会改变)

我该如何做?

1

  • 1
    如果您将路径名放入数组中,则在它们之间添加空格是无关紧要的。或者您还需要在终端中显示它们?


    – 



最佳答案
3

将原始名称读入数组:

readarray -t names <groupAfiles.txt

将初始file前缀替换为/dev/loop

names=( "${names[@]/#file//dev/loop}" )

如果存在前缀字符串,则这里使用的替换将用字符串替换数组file中每个元素开头的字符串names/dev/loop

显示元素之间带有空格的结果数组(假设 shell 变量IFS具有其默认值):

printf '%s\n' "${names[*]}"

测试:

$ cat groupAfiles.txt
file14
file2
file4
file9
$ readarray -t names <groupAfiles.txt
$ names=( "${names[@]/#file//dev/loop}" )
$ printf '%s\n' "${names[*]}"
/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9

为此,awk您可以使用如下命令:

awk '{gsub("file",""); printf "/dev/loop%s ", $0}' input_file

或者

awk '{gsub("file","/dev/loop"); printf "%s ", $0}' input_file

它用空值替换file,然后打印/dev/loop与数字/字符串连接的内容

要添加数组,您可以使用:

array=( $(awk '{gsub("file",""); printf "/dev/loop%s ", $0}' input_file) )

只需将其读入数组,然后按照你喜欢的方式以空格分隔打印即可:

$ readarray -t files < <(sed 's:file:/dev/loop:' groupAfiles.txt)

$ declare -p files
declare -a files=([0]="/dev/loop14" [1]="/dev/loop2" [2]="/dev/loop4" [3]="/dev/loop9")

$ printf '%s\n' "${files[*]}"
/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9