우분투 12.04를 사용합니다.
파이프 사용(5회):
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC
real 0m0.005s
user 0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC
real 0m0.004s
user 0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC
real 0m0.004s
user 0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC
real 0m0.005s
user 0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
ABC
real 0m0.005s
user 0m0.004s
sys 0m0.000s
파이프가 없는 경우(5회):
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC
real 0m0.003s
user 0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC
real 0m0.003s
user 0m0.000s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC
real 0m0.003s
user 0m0.004s
sys 0m0.000s
$ time echo XYZ | sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
ABC
real 0m0.003s
user 0m0.000s
sys 0m0.000s
$
파이프를 사용하지 않는 것이 더 빠르다는 것은 분명합니다. 따라서 스크립트를 최적화하는 데 사용할 수 있습니다.
$ echo ABC | sed 's/A/X/g; s/X/Y/g'
YBC
$
내 질문:sed를 병합하면 항상 동일한 출력이 생성됩니까?
답변1
짧은 대답은 다음과 같습니다.관로다른 대체를 수행하려면 쉘이 여러 번 분기되어야 합니다.
반면, sed
다양한 대체 명령이 포함된 표현식에서는 셸이 한 번만 포크하면 됩니다.
따라서 다음과 같이 단일 표현식에 다양한 명령을 포함하는 것이 더 효율적입니다.
sed 's/X/A/g; s/Y/B/g; s/Z/C/g'
두 번째 부분에 답하기 위해 위의 내용은 다음과 같습니다.느리게변형:
sed 's/X/A/g' | sed 's/Y/B/g' | sed 's/Z/C/g'
답변2
예, 게시한 두 명령은 100% 동일하므로 파이프를 사용하지 않도록 스크립트를 안전하게 변경할 수 있습니다.
echo XYZ
그러나 당신의 추론에는 결함이 있습니다. 실제 호출이 아니라 걸리는 시간만 측정하고 있습니다 sed
. 그러나 파이프를 사용하지 않는 것이 여전히 더 빠르다는 것을 알게 될 것입니다 :)
dennis@spirit:~$ time sh -c 'echo XYZ | sed -e s/X/A/ | sed -e s/Y/B/ | sed -e s/Z/C/'
ABC
real 0m0.009s
user 0m0.000s
sys 0m0.012s
dennis@spirit:~$ time sh -c 'echo XYZ | sed -e s/X/A/ -e s/Y/B/ -e s/Z/C/'
ABC
real 0m0.006s
user 0m0.000s
sys 0m0.006s
답변3
sed
조건부로 포크 할 수 있는 GNU 확장도 있습니다 :
sed '/num/s//echo "$((num+1))"/e'
info sed
e
이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프할 수 있습니다. 대체가 이루어지면 패턴 공간에 있는 명령이 실행되고 해당 출력이 패턴 공간을 대체합니다. 후행 줄 바꿈은 억제됩니다. 실행할 명령에 NUL 문자가 포함되어 있으면 결과가 정의되지 않습니다.
이것은 GNU 'sed' 확장입니다.