파일이 아닌 문자열 변수에 sed를 사용하십시오.


30

가능하다는 말을 들었지만 작동하는 단일 예제가 sed없으면 입력 파일이 없어도 문자열 변수에서 읽을 수 있습니다. 나는 그것을 작동시키지 못했습니다. 일반적인 안전을 위해, 나는 $PATH이것을 엉망으로 만드는 다른 변수에 변수를 쓰고 있습니다. 왜냐하면이를 수행하는 방법을 정확히 알 때까지 다른 문제가 필요하지 않기 때문입니다.

다음을 고려하세요:

~$x=$PATH
~$sed -i 's/:/ /g' $x

이러한 파일이나 디렉토리가 없습니다.

내가 시도한 다른 것들이 있습니다.

~$ sed -i 's/:/ /g' | (read x) 
sed: no input files
~$ sed -i 's/:/ /g' | (read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x) 
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x 
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x) 
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x)) 
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x)) 
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x)) 
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' |  echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files

이것도 효과가 있을까요? sed를 사용하기 위해 필요하지 않은 파일을 작성하지 않아도됩니다. 이 특정 예에서 ~$x=$PATH ~$sed -i 's/:/ /g' $x실제로 내가 원하는 방식으로 작동하면 다음과 같은 결과를 얻습니다.

/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

그런 다음 변수에 할당하고 향후 명령에서 사용할 수 있습니다. ls $x


1
x=$(echo "$x" | sed 's/:/ /g')?
heemayl

답변:


16

아마도:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games

@jOh --- sed여기서 "문자열 변수"(?)에서 작동하지 않지만 표준 입력에서 --- 이것이 어떻게 작동하는지 주목 하십시오.
Rmano

나는 sed 개발자들에게 기능 요청을 할 것이라고 생각한다
j0h

4
@ j0h 이것은와 관련이 없으며 sed쉘이 입력을 리디렉션하는 방법에 대한 질문입니다. sed입력 스트림을 처리하고 표준 입력을 통해 읽습니다. 파일인지 여부는 관련이 없습니다. 표준 입력을 통해 들어오는 모든 것을 받아 들일 수 있습니다.
terdon

38

이것은 sed표준 입력을 읽는 모든 프로그램에 적용됩니다. 어쨌든, 당신이 찾고 있던 것은

sed 's/:/ /g' <<<"$PATH"

다른 변수에 저장할 이유가 없습니다. 이렇게하면 아무것도 변수에 저장된 값에 영향을 미치지 않습니다. 이를 위해 할당 연산자 ( =)가 필요합니다. 위에서 사용 된 구문을 "여기서 문자열" 이라고하며 bash, ksh 및 zsh에만 해당됩니다. 표준 입력에서 읽는 프로그램에 변수 값을 입력으로 전달하는 역할을합니다.

나는 이와 같은 다양한 쉘 연산자를 모두 나열 하는 U & L에 대한 답변을 작성했습니다 . 당신은보고 싶어 할 수 있습니다.

당신도 할 수 있음을 유의하십시오

echo "$PATH" | sed 's/:/ /g' 

마지막으로, 당신 sed은 이것을 위해 전혀 필요하지 않습니다 . bash에서 모든 것을 직접 할 수 있습니다.

echo "${PATH//:/ }"

위의 bash 대체 구문입니다. 변수 감안할 때 $var, 패턴 pat및 교체 ( rep모든 항목 대체), pat과를 rep, 당신은 할 것

echo "${var//pat/rep}"

단일 슬래시가있는 동일한 항목이 첫 번째 항목 만 대체합니다.

echo "${var/pat/rep}"

2
'bash replacement construct'에 감사드립니다. Bash 함수에서 "$ {1 / from / to}"를 사용하여 첫 번째 인수를 후속 매개 변수로 변경할 수있었습니다.
AAAfarmclub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.