그래서 텍스트 파일에 다음 줄이 있습니다.
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