n번째 구분 기호 앞의 모든 항목을 인쇄합니다.

n번째 구분 기호 앞의 모든 항목을 인쇄합니다.

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")}'

관련 정보