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

内部のすべてをキャプチャグループといい、最初のグループ、2番目のグループ(...)などの逆参照を使用します(最大値のみ)。\1\2\9

:一致リテラルは、:
[^,]*カンマを除くすべての文字と一致
\.jksします.jks

:[^,]*\.jks,コロンの後に.jksカンマで終わるすべての項目と一致します。この部分を([^,]*\.jks)最後に移動するために、(...)コロンを削除して:キャプチャグループの外に置きます。

外部キャプチャグループは、(.*)キャプチャグループの上のすべての項目をキャプチャします。 1つ目は\1(.*)」、2つ目は「」\2([^,]*\.jks)3つ目は「\3(,.*)でアクセスできます。

答え2

GNUでテストされましたawk

  • split()最初のフィールドは配列に配置され、そのa$1に再割り当てされ、その値として生成されます。a[1]a[2]$5a[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

関連情報