因此,我在文本文件中包含以下行:
CN=blabla:client:blablafile.jks, 26-Oct-2019, fabric, hostname:/path/to/jks/file/
我需要将其移至:blablafile.jks
行尾,输出如下:
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile.jks
因此,在将字符移动到行尾时,我:
还需要删除该字符。blablafile.jks
使用 sed 命令尝试了一些操作,但我只解决了如何将日期移动到文件末尾。但不确定我应该如何继续获得所需的输出。
有人可以帮我一点吗?
编辑:
*.jks
另外,是否可以以将所有文件移至每行末尾的方式构建该特定命令?
基本上:
CN=blabla:client:blablafile.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
CN=blabla:client:blablafile31242.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
CN=blabla:client:blablafile3222242.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
成为:
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile31242.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile3222242.jks
答案1
使用sed
:
sed -E 's/(.*):([^,]*\.jks)(,.*)/\1\3, \2/' infile
里面的任何内容(...)
都被称为捕获组,它们将采用反向引用,例如\1
第一组、\2
第二组……(最多仅限最大\9
)。
:
匹配文字:
[^,]*
匹配除逗号之外的任何字符;
\.jks
匹配文字点,.
后跟jks
:[^,]*\.jks,
匹配冒号后跟任何以.jks
逗号结尾的内容;我们希望这部分([^,]*\.jks)
移到最后,所以我们将其包围在里面(...)
;我们将删除冒号:
,因此我们将其留在捕获组之外。
外部捕获组捕获(.*)
捕获组上方周围的任何内容;第一个可通过\1
“ (.*)
”访问,第二个可通过\2
“ ([^,]*\.jks)
”访问,第三个可通过\3
“ (,.*)
”访问。
答案2
在 GNU 中测试awk
。
split()
第一个字段放入数组中a
,然后重新分配$1
给a[1]
和a[2]
值并$5
使用a[3]
值创建。- OFS 作为分隔符。
awk -F, '{split($1,a,":",sep);$1=a[1]sep[1]a[2]; $5=a[3]; print $0}' OFS=',' file
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile31242.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile3222242.jks