텍스트 파일에서 한 줄을 복사하고 즉시 편집하여 모든 /를 |로 바꾸고 같은 줄의 같은 줄에 붙여넣고 싶습니다.
텍스트 파일의 첫 번째 줄은 다음과 같습니다.
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg
(name-never-changes)와 .jpg 사이에 텍스트 복사
/aCcboeasdfdRD/asdfasdft21
/으로 변경 |
|aCcboeasdfdRD|asdfasdft21
그리고 URL이 있는 줄 끝에 구분 기호를 추가하세요. 구분 기호는 텍스트, 숫자 또는 특수 문자일 수 있습니다.
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg (separator) |aCcboeasdfdRD|asdfasdft21
이는 URL이 다른 여러 텍스트 파일에 대해 작동합니다.
새 파일을 만들고 병합할 수 없습니다. 텍스트 파일의 이름이 다르고 파일 이름을 모르기 때문에 동적이어야 합니다.
답변1
이 시도,
awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file
http://webpage.com/(name-never-changes)/aCcboeasdfdRD/asdfasdft21.jpg (saperatot) |aCcboeasdfdRD|asdfasdft21
/.
두 개의 필드 구분 기호$0
전체 줄을 인쇄$(NF-2) $(NF-1)
마지막에서 세 번째와 두 번째 필드
파일로 저장하고 싶다면
옵션 1:(행이 적은 경우)
echo "`awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file`" > file
옵션 2:(대용량 파일인 경우)
awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' file > tempFile ; mv tempFile file
폴더에 여러 파일이 있는 경우:
cd /path/to/dir
for file in `ls`
do
echo "`awk -F '[/.]' '{print $0" (separator) |"$(NF-2)"|"$(NF-1)}' $file`" > $file
done
답변2
해결책 은 다음과 같습니다 sed
.
sed 'h; s@^[^/]*//[^/]*/[^/]*/@ (separator) |@; s@/@|@g; s/\.jpg$//; x; G; s/\n//'
단계별:
h
현재 라인을 "패턴 공간"에서 "예약 공간"으로 복사합니다.s@^[^/]*//[^/]*/[^/]*/@ (separator) |@
는에스대체 명령은 구분 기호로 사용됩니다@
. 그것은 대체한다물건//물건/물건/
(즉) 원하시면 할 수 있습니다.http://example.com/(top-level-directory)/
(separator) |
s@^http//example.com/(top-level-directory)/@ (separator) |@
s@/@|@g
또한에스대체 명령은 구분 기호로 사용됩니다@
./
줄의 나머지 모든 문자를 문자로 바꿉니다|
. 확실하다면 ((second-level-directory)
그리고(filename)
), 생략할 수 있습니다g
.s/\.jpg$//
분명히.jpg
확장은 줄 끝에서 제거됩니다. (확장자가 무엇인지 모른다면 비슷한 것을 할 수 있습니다s/\.[^.]*$//
.)x
패턴 공간과 홀드 공간을 교환하여 원래 행이 이제 패턴 공간으로 돌아오도록 합니다.(분할기) |(보조 디렉토리)|(파일 이름)
우리가 방금 만든 것은 화물칸에 위치해 있습니다.G
Gets는 공간의 내용을 유지하고 이를 패턴 공간에 추가합니다(그 사이에 개행 문자 삽입).s/\n//
개행 문자를 제거합니다.
그러면 빈 줄이 빈 줄로 전달됩니다. 다른 라인은 파괴됩니다.
파일을 그 자리에서 편집하려면 sed
옵션을 전달하면 됩니다 -i
(또는 -i.bak
시스템에서 요구하는 경우).