|pipe| 사이의 문자를 제거하세요.

|pipe| 사이의 문자를 제거하세요.

수정해야 할 다양한 텍스트 파일이 있습니다.

test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|...

다음과 같이 파이프라인 처리를 포함하여 "test5232.lop" 삭제 프로세스를 자동화하려고 합니다.

test.xyz|test3.abc|filename.test|file.text|qwerty.bat|...

가능하면 임시 파일을 생성할 필요가 없습니다.

답변1

이것은 직업인 것 같습니다 cut. 구분 기호가 이고 |, 유지할 필드( --complement)가 아닌 삭제할 필드를 지정하고 필드 3(이 경우 삭제하려고 함)을 선택하려고 한다고 알려줍니다 .

암호:

 cut -d '|' --complement -f 3

시험:

$ echo 'test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|x' | cut -d '|' --complement -f 3
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|x

답변2

그냥 Sed를 사용하세요:

sed 's/|test5232\.lop//' file.txt

설명 요청 전 원래 답변:

POSIX 기능만 사용하세요.:

sed 's/|[^|]*//2' file.txt

모든 라인에 최소한 세 개의 |기호가 있다는 것을 알고 있다면 보다 직관적인 형식을 사용할 수 있습니다.

sed 's/[^|]*|//3' file.txt

답변3

세 번째 필드("필드"는 "파이프를 제외한 모든 것, 0회 이상, 뒤에 파이프가 오는 것"임)를 다른 것으로 바꾸려면 다음을 수행하십시오.

awk '{$0=gensub(/[^|]*\|/, "", 3); print $0}' input

분명히 줄의 어느 곳에서나 "test5232.lop"을 제거하고 싶습니다.

sed -i 's/|test5232\.lop//' input

sed -i( 임시 파일 생성을 포함한 모든 솔루션이 있지만 )

답변4

또한 이 awk 간단한 솔루션을 확인하십시오. 문자열은 어디에 있든 제거되며 이식 가능해야 합니다.

$ a="test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat"
$ awk -F"test5232.lop." '{printf("%s%s\n",$1,$2)}' <<<"$a"
test.xyz|test3.abc|filename.test|file.text|qwerty.bat

내부 편집 요청과 관련하여 GNU AWK 버전 > 4.1도 다음에 따라 작동할 수 있습니다.친구 매뉴얼:

awk -i inplace -v INPLACE_SUFFIX=.bak '{...}'

그러나 어떤 경우에도 awk, sed 및 Perl은 진정한 내부 편집을 달성할 수 없습니다. GNU sed정보 페이지에서는 이 문제를 명확하게 설명합니다.

'-i[SUFFIX]'
'--in-place[=SUFFIX]'
     This option specifies that files are to be edited in-place.  GNU
     'sed' does this by creating a temporary file and sending output to
     this file rather than to the standard output.(1).

즉, 끝에 다음과 같은 내용을 추가하여 여기에서 어떤 솔루션이든 사용할 수 있습니다.

awk/sed/perl/whatever oldfile >tmpfile && mvtmpfile oldfile && rm -f tmpfile 

관련 정보