`sed`가 각 줄의 다섯 번째와 일곱 번째 공백을 단일 `s/` 대체 명령으로 바꿀 수 있습니까?

`sed`가 각 줄의 다섯 번째와 일곱 번째 공백을 단일 `s/` 대체 명령으로 바꿀 수 있습니까?

다섯 번째와 일곱 번째 공백만 다음으로 바꿀 수 있습니다.

$ echo "1 2 3 4 5 6 7 8" | sed 's/\ /x/5;s/\ /x/6'
1 2 3 4 5x6 7x8

하지만 sed지원 목록과 범위가 있을 수도 있습니다.Ns/세미콜론으로 구분된 두 개의 대체 대신 하나의 대체만 사용하여 패턴이 발생합니까 ?

$ echo "1 2 3 4 5 6 7 8" | sed 's/\ /x/5,7'
sed: -e expression #1, char 9: unknown option to `s'

답변1

중괄호 확장 csh(csh, tcsh, zsh, bash, pdksh, ksh93, yash -o braceexpand) 과 유사한 쉘의 경우 fish다음을 수행할 수 있습니다.

$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7,6,5}
1 2 3 4 5x6x7x8 9 

중괄호 확장은 이것을 다음으로 확장합니다.

sed '-es/ /x/'7 '-es/ /x/'6 '-es/ /x/'5

하나의 대체가 다음 대체에 영향을 미치지 않도록 뒤로 진행합니다.

{x..y}from 형식을 사용하여 범위로 설정할 수 있습니다 zsh(이제 bash 및 ksh93도 이를 지원합니다 yash -o braceexpand).

$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7..3}
1 2 3x4x5x6x7x8 9

또는 두 가지 형식의 조합:

$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{{7..3},1}
1x2 3x4x5x6x7x8 9

다음을 사용하여 zsh배열에 넣을 수 있습니다 .

$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'$^substs
1x2 3x4 5x6x7x8 9

그리고 zsh올바른 역순으로 정렬하세요.

$ substs=(1 8 6)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'${(On)^substs}
1x2 3 4 5 6x7 8x9

zsh또는 를 사용하여 bash다음을 수행할 수도 있습니다.

$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed "${substs[@]/#/-es: :x:}"
1x2 3x4 5x6x7x8 9

fish(및 GNU )를 사용하면 seq다음을 수행할 수 있습니다.

$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'(seq 6 -1 3)
1 2 3x4x5x6x7 8 9

또는:

$ set substs 5 3 1
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'$substs
1x2 3x4 5x6 7 8 9

( fish배열은 이 예나 이 예에서처럼 확장됩니다 rc. zsh -o rcexpandparam)


를 사용하면 perl다음을 수행할 수 있습니다.

$ echo 1 2 3 4 5 6 7 8 9 | perl -pe 'BEGIN{$h{$_}=1 for (3,5..8)}
                                     my $n; s/ /$h{++$n} ? "x" : $&/ge'
1 2 3x4 5x6x7x8x9

답변2

$ echo $SHELL
/bin/bash
$ set -- 6 7 # or bash -s 6 7 (set positional parameters)
$ echo "1 2 3 4 5 6 7 8" | sed "s/ /x/$1"
1 2 3 4 5 6x7 8
$ shift # ¹
$ echo "1 2 3 4 5 6 7 8" | sed "s/ /x/$1"
1 2 3 4 5 6 7x8

1:

$help Shift
Shift: Shift [n]
Shift 위치 매개변수.

위치 매개변수 $N+1,$N+2...의 이름을 $1,$2...로 바꾸십시오. N이 제공되지 않으면 1로 간주됩니다.

종료 상태: N이 음수이거나 $#보다 크지 않으면 성공을 반환합니다.

관련 정보