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다음 해당 값 $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

관련 정보