편집 1

편집 1

다음 쉘 스크립트가 있습니다.

#!/bin/sh
echo "Configuring Xdebug"
ip=10.0.2.2
xdebug_config="/etc/php/7.2/mods-available/xdebug.ini"

echo "IP for the xdebug to connect back: ${ip}"
echo "Xdebug Configuration path: ${xdebug_config}"
echo "Port for the Xdebug to connect back: ${XDEBUG_PORT}"
echo "Optimize for ${IDE} ide"

if [ $IDE=='atom' ]; then
  echo "Configuring xdebug for ATOM ide"
  config="xdebug.remote_enable = 1
xdebug.remote_host=${ip}
xdebug.remote_port = ${XDEBUG_PORT}
xdebug.max_nesting_level = 1000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
xdebug.remote_log=xdebug.log"
 # replace the file in $xdebug_config var except first line
fi

내가 원하는 것은 $xdebug_config변수에 언급된 파일의 첫 번째 줄을 바꾸는 것입니다.와는 별개로첫번째 줄. 예를 들어, 파일이 다음과 같은 경우:

line 1
line 2
somethig else
lalala

다음과 같이 변환하고 싶습니다.

line 1
xdebug.remote_enable = 1
xdebug.remote_host=${ip}
xdebug.remote_port = ${XDEBUG_PORT}
xdebug.max_nesting_level = 1000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
xdebug.remote_log=xdebug.log

어떻게 해야 하나요?

편집 1

의견의 요청에 따라 $xdebug_config다음과 같은 가능한 값이 포함될 수 있습니다.

 /etc/php/7.2/mods-available/xdebug.ini
 /etc/php/5.6/mods-available/xdebug.ini
 /etc/php/7.0/mods-available/xdebug.ini

일반적으로 다음 형식을 사용합니다.

 /etc/php/^number^.^number^/mods-available/xdebug.ini

편집 2

쉘 스크립트를 더욱 명확하게 개선했습니다.

답변1

여기 문서는 어떤가요?

line1=$(head -1 "$1")
cat <<EORL >"$1"
${line1}
this is line2
how about this for line3?
let's do another line!
moving on to the next line
Wait!  There's more???
EORL

exit 0

답변2

파일의 내용을 알려진 데이터로 바꾸되 첫 번째 줄은 유지하려면 다음을 수행할 수 있습니다.

oldfile="/path/to/original/file"
newfile="$(mktemp)"
head -n1 "$oldfile" > "$newfile"
cat << EOF >> "$newfile"
Hey, all of these lines?
The lines after "cat"?
All of these lines up to and excluding the next line will be written.
EOF
mv "$oldfile" "${oldfile}.old"
mv "$newfile" "$oldfile"

새 파일을 만들고 완전히 구성된 후 해당 위치로 이동하면 롤백해야 할 경우를 대비해 마지막 버전을 유지할 수 있다는 이점이 있습니다.

그렇게 하는 데 관심이 없다면 이전 파일을 날려버릴 수 있지만 동일한 작업으로 해당 파일을 읽고 쓸 수는 없으므로 다음과 같이 작동합니다.

header="$(head -n1 /path/to/file)"
echo "$header" > /path/to/file
cat << EOF >> /path/to/file
Hey, all of these lines?
The lines after "cat"?
All of these lines up to and excluding the next line will be written.
EOF

답변3

난 쓸수있다

{ sed 1q "$xdebug_config"; echo "$config"; } | sponge "$xdebug_config"

spongemoreutils패키지 내부에 위치해 있습니다 . 설치하고 싶지 않은 경우:

tmp=$(mktemp)
{ sed 1q "$xdebug_config"; echo "$config"; } > "$tmp" && mv "$tmp" "$xdebug_config"

답변4

다음을 수행할 수 있습니다.

tempd=$(mktemp -d);printf '%s\n' "$config" > "$tempd/config"
sed -i -e "r $tempd/config" -e q "$xdebug_config"
rm -rf "$tempd"

관련 정보