sed 명령을 올바르게 바꿀 수 없습니다

sed 명령을 올바르게 바꿀 수 없습니다

job.sh 스크립트에는 다음 문자열이 있습니다.

/home/myname/code_DEM/ > output.txt

대신 다음을 사용하고 싶습니다.

/home/myname/code_DEM/ > output_"$datetime".txt

여기서 $datetime은 날짜와 시간을 자동으로 로드하는 문자열입니다.

이 작업을 수행하기 위해 sed 명령을 사용해 보았습니다.

sed -i 's/"$LINEout"/"$LINEnew"/' job.sh

$LINEout바꾸려는 이전 문자열은 어디에 있고 $LINEnew새 문자열(날짜와 시간이 있는 문자열)은 어디에 있습니까?

지금까지 나는 내가 원하는 것을 얻지 못했고 아무것도 변하지 않았습니다.

추신: Linux 및 MacO에서 작동하는 솔루션이 있다면 좋을 것입니다. sed 명령의 구문은 Linux마다 Mac에서 약간 다르다고 생각합니다. :)

답변1

이 시도:

sed -i "s|$LINEout|$LINEnew|" job.sh

macOS에서 백업을 지정해야 하는 경우 다음을 사용해야 합니다.

sed -i "" "s|$LINEout|$LINEnew|" job.sh

예:

echo "foo
bar" > sample
cat sample 
foo
bar

rep=bar
sed -i.bak "s|$rep|baz|" sample
cat sample
foo
baz
cat sample.bak 
foo
bar

macOS X 10.11.6 및 BSD sed로 테스트됨

답변2

BSD(예: Apple OS/X)는 sed -i '' ...백업 없이 내부 편집을 사용하는 반면 GNU는 sed -i ...대부분의 다른 시스템에서 sed내부 편집을 지원하지 않습니다.

perl둘 다 의 옵션에서 얻습니다 -i. 따라서 이식성을 위해 로 되돌리면 perl변수의 특수 문자 문제도 해결됩니다.

A=$LINEout B=$LINEnew perl -i -pe 's/\Q$ENV{A}\E/$ENV{B}/g' job.sh

답변3

잘 찾았습니다. 클릭해주신 @maulinglawns에게 감사드립니다.) 실제로 다음과 같이 구분 기호를 변경해야 합니다.

sed -i "s:$LINEout:$LINEnew:" job.sh

관련 정보