sed/awk 将内容从字符串移动到行尾

sed/awk 将内容从字符串移动到行尾

因此,我在文本文件中包含以下行:

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,然后重新分配$1a[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

相关内容