![n번째 구분 기호 앞의 모든 항목을 인쇄합니다.](https://linux55.com/image/226483/n%EB%B2%88%EC%A7%B8%20%EA%B5%AC%EB%B6%84%20%EA%B8%B0%ED%98%B8%20%EC%95%9E%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
sed
나는 다음과 같은 해결책을 찾고 있습니다 .n번째 구분 기호 이후의 모든 항목을 인쇄합니다.
sed -E 's/^([^\]*[\]){3}//' infile
하지만 예제처럼 n번째 구분자를 추출하는 대신 n번째 구분자 앞의 텍스트를 추출합니다. 모든 sed 변형에 작동하는 것입니다. 예제와 같이 모든 행에 대해 수행합니다.
이 예의 구분 기호 \
는 다른 구분 기호일 수 있습니다. 모든 버전의 sed에서 작동해야 합니다.
답변1
왜 그것을 사용하지 않습니까 cut
?
cut -d '\' -f 1-3 infile
일치 항목을 제거하는 대신 을 사용하여 sed
이를 캡처하고 역참조를 사용하여 전체 줄을 캡처된 그룹으로 바꿉니다.
sed -E 's/(^([^\]*[\]){3}).*/\1/' infile
이것은 후행 백슬래시도 인쇄하지만... 이를 방지하려면 다음을 실행할 수 있습니다.
sed -E 's/(^([^\]*[\]){2}[^\]*).*/\1/' infile
답변2
짧은 awk:
awk NF=3 FS='\\' OFS='\\'
- 입력 및 출력 필드 구분 기호 정의
- 유지할 필드 수 설정
답변3
n번째 구분 기호를 개행 문자로 대체한 다음 (그렇지 않으면 개행 문자가 패턴 공간에 표시되지 않음) 개행 문자로 시작하는 모든 항목을 제거할 수 있습니다. n==3의 경우:
sed 's/delim/\
/3; P; d'
또는 출력에서 n번째 구분 기호를 유지해야 하는 경우:
sed 's/delim/&\
/3; P; d'
n 구분 기호 없이 줄을 건너뛰려면 다음을 수행하세요.
sed -n 's/delim/\
/3; t1
d; :1
P'
답변4
사용 awk
:
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ split($0,arr,OFS);
$0="";
for (i=1; i<=var; ++i) $(NF+1)=arr[i];
print}'
n번째 구분 기호를 유지하려면 다음 명령을 사용할 수 있습니다.
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ for (i=1; i<=var; ++i) printf "%s%s", $i, OFS; print ""}'
$ nawk '(match($0, /^([^\\]*[\\]){3}/))
{ print substr($0,RSTART,RLENGTH)}'
그리고 GNU awk
:
다음 명령은 캡처된 그룹에 대한 역참조를 사용합니다. 이것은 다음에서 가져온 awk 명령입니다.이 답변. @don_crissti 감사합니다
$ awk -F "\\" -v col=3 '(NF>=col){print gensub(/(^([^\\]*[\\]){3}).*/, "\\1", "g")}'