다섯 번째와 일곱 번째 공백만 다음으로 바꿀 수 있습니다.
$ 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이 음수이거나 $#보다 크지 않으면 성공을 반환합니다.