수정해야 할 다양한 텍스트 파일이 있습니다.
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