여러분, 안녕하세요!
sed cmd를 사용하여 텍스트 파일의 디렉터리 경로를 변경하려고 합니다.
명령을 테스트하고 있는 서버는 Rocky Linux 8.5(Green Obsidian)를 실행하고 있습니다.
이것은 내가 사용하는 sed 명령입니다.
sed -i 's|1344P1052_ssl02 /gs:/prod1|sd://prod1-backup|g' example.txt
sed -i 's|1344P1052_ssl09 /gs:/prod1|sd://prod1-backup|g' example.txt
출력에는 오류가 없지만 파일의 디렉터리 경로는 동일하게 유지됩니다.
변경되어야 합니다. [아래 예]
앞으로:
1344P1052_ssl02 /gs:/prod1/some_notes_here_1
1344P1052_ssl09 /gs:/prod1/some_notes_here_2
뒤쪽에:
sd://prod1-backup/some_notes_here_1
sd://prod1-backup/some_notes_here_2
공백, 세미콜론 등으로 인해 작동하지 않는 줄 알았는데 그룹의 답변을 Google에서 검색하여 사용했습니다.|
특수 문자, 백슬래시 및 공백을 사용해야 합니다. 이제는 확실하지 않아서 vim을 사용하여 한 줄씩 수동으로 수행했습니다.
어떤 도움이라도 정말 감사드립니다...
답변1
입력 파일의 두 열이 공백으로 구분되지 않고 탭으로 구분되어 있기 때문에 교체가 실패했다고 가정합니다.
정규식에서 공백 대신 리터럴 탭 문자(명령줄에 입력 사용)를 사용 하거나 (단일 탭 또는 공백 문자 일치) 또는 (일치) Ctrl+V Tab와 같이 탭 문자를 나타내는 표현식을 사용할 수 있습니다. 단일 가로 및 세로 탭, 캐리지 리턴 등을 포함하여 더 큰 공백과 유사한 문자 그룹 내의 단일 문자입니다.[[:blank:]]
[[:space:]]
sed -e 's|^1344P1052_ssl02[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-e 's|^1344P1052_ssl09[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
아니면 더 짧게,
sed -e 's|^1344P1052_ssl0[29][[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
- 패턴의 공백을 로 바꾸었습니다
[[:blank:]]
. 이렇게 하면 텍스트의 해당 위치에 단일 공백이나 탭이 허용됩니다. sed
또한 전체 파일을 두 번 읽는 것을 피하기 위해 이 두 가지 교체를 하나의 호출로 결합했습니다 .g
한 줄에 두 번 이상의 교체를 수행하고 싶지 않기 때문에 두 교체 명령 모두에서 플래그를 제거했습니다 .^
각 줄의 시작 부분에 패턴이 일치하는지 확인하기 위해 앵커를 추가했습니다 .- 더 높은 번호의 콘텐츠
/
와 관련된 행이 실수로 변경되는 것을 방지하기 위해 패턴 끝에 대체 문자열을 추가 했습니다 .prod10
prod