편집하다:

편집하다:

저는 Linux 및 Solaris(Nexenta)용 스크립트를 사용하고 있습니다.

이 줄은 Linux에서는 작동하지만 Solaris에서는 작동하지 않습니다(그러나 쉘에서 실행될 때는 작동합니다).

cat "pg_hba.conf" | sed "0,/^local/{s/md5/trust/}"

오류 메시지는 다음과 같습니다.

sed: command garbled: 0,/^local/{s/md5/trust/}

sed약간의 조사 끝에 나는 bash가 스크립트에서 다르게 사용된다는 것을 발견했습니다 .

셸에서:/usr/bin/sed

스크립트에서:/usr/sun/bin/sed

스크립트를 사용하고 싶습니다 /usr/bin/sed.

내가 시도한 것 :

  1. sed전화를 걸려면 전체 경로를 사용하세요. 결과는 동일합니다. 아직 다른 제품을 사용하고 있는 것 같은데 sed...
  2. 로 전화해 보세요 bash -l. 결과는 동일합니다.
  3. 다른 명령을 선언하려고 시도했습니다 . S=/usr/lib/sed. $S결과는 동일합니다.
  4. PATH를 확인하세요. cmd와 스크립트가 모두 /usr/bin포함되어 있습니다.
  5. 큰따옴표를 작은따옴표로 바꿔보세요. 결과는 동일합니다.
  6. -r 플래그를 사용하여 sed를 실행해 보세요. 출력은 다음과 같습니다

    # /usr/xpg4/bin/sed -r /usr/xpg4/bin/sed: illegal option -- r Usage: sed [-n] script [file...] sed [-n] [-e script]...[-f script_file]...[file...]

돕다? ?

내가 해야 할 일은 "local"로 시작하는 첫 번째 줄에서 처음 나타나는 "md5"를 "trust"로 바꾸는 것입니다. 나는 이것을 할 수 있다는 것을 알고 있지만 이 sed질문은 나를 너무 간지럽힙니다!

편집하다:

이번 일로 주문이 좀 들어오길 바라요...

  1. 로그인 쉘 경로 =/usr/local/ctera/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin
  2. 스크립트의 경로 =
    /usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin:/usr/local/ctera/apache-ant-1.8.2/bin
  3. PATH=$(command -p getconf PATH):$PATHPATH = 호출 시 스크립트에 있음/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin:/usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin:/usr/local/ctera/apache-ant-1.8.2/bin
  4. truss -f sed로그인 쉘에서 호출됨/usr/bin/sed
  5. truss -f sed스크립트에서 호출됨/usr/sun/bin/sed
  6. truss -f /usr/bin/sed스크립트에서 호출됩니다 /usr/sun/bin/sed! ! !
  7. 설정 후 PATH=$(command -p getconf PATH):$PATH:
    7.1 truss -f sed스크립트 호출에서 /usr/xpg4/bin/sed
    7.2 truss -f /usr/bin/sed스크립트 호출에서 /usr/sun/bin/sed!

추가 정보:

명령 출력: (쉘 프롬프트 및 스크립트 내에서 실행)

  1. truss -ft execve /usr/bin/sed q
    쉘 명령으로:
    8604: execve("/usr/bin/sed", 0x08047D20, 0x08047D2C) argc = 2
    스크립트에서:
    8545: execve("/usr/sun/bin/sed", 0x08047768, 0x08047774) argc = 2

  2. file /usr/bin/sed
    쉘 명령으로:
    /usr/bin/sed: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
    스크립트에서:
    file: /usr/bin/sed zero size or zero entry ELF section - ELF capabilities ignored file: /usr/bin/sed: can't read ELF header /usr/bin/sed: data

  3. ls -l /usr/bin/sed
    쉘 명령으로:
    -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
    스크립트에서:
    -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed

  4. ls -ld $(type -pa sed)
    쉘 명령으로:
    -rwxr-xr-x 1 root root 96440 May 31 2008 /bin/sed -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
    스크립트에서:
    -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed

  5. md5sum $(type -pa sed)
    쉘 명령으로:
    385361c5111226c8eac8e25b53fed29c /bin/sed 385361c5111226c8eac8e25b53fed29c /usr/bin/sed
    스크립트에서:
    385361c5111226c8eac8e25b53fed29c /usr/bin/sed

    • 이 스크립트는 JAVA 코드로 호출됩니다.

    • uname -a
      SunOS cteraportal 5.11 NexentaOS_134f i86pc i386 i86pc Solaris

    • sed내 컴퓨터의 버전에 대한 정보가 추가될 수 있습니다.

      ~# ll `find / -name sed`  
      -rwxr-xr-x 1 root root 96440 May 31  2008 /usr/bin/sed  
      -r-xr-xr-x 1 root bin  35656 Sep  7  2010 /usr/sun/bin/sed  
      -r-xr-xr-x 1 root bin  32104 Sep  7  2010 /usr/ucb/sed  
      -r-xr-xr-x 1 root bin  35636 Sep  7  2010 /usr/xpg4/bin/sed  
      
      /usr/share/doc/sed:  
      total 113  
      -rw-r--r-- 1 root root   168 Jun 21  2005 AUTHORS.gz  
      -rw-r--r-- 1 root root  2507 Jun 21  2005 BUGS.gz  
      -rw-r--r-- 1 root root  6584 Feb  3  2006 NEWS.gz  
      -rw-r--r-- 1 root root   285 Jun 21  2005 README.gz  
      -rw-r--r-- 1 root root  1071 Jan 12  2006 THANKS.gz  
      -rw-r--r-- 1 root root  4806 May 31  2008 changelog.Debian.gz  
      -rw-r--r-- 1 root root 32312 Feb  3  2006 changelog.gz  
      -rw-r--r-- 1 root root   796 May 31  2008 copyright  
      drwxr-xr-x 2 root root     3 May 30  2011 examples  
      drwxr-xr-x 2 root root     3 May 30  2011 sed-4.1.5  
      -rw-r--r-- 1 root root 56538 May 31  2008 sedfaq.txt.gz  
      

답변1

알겠습니다. 찾았습니다. 이제 이것이 의미가 있습니다.

이 동작은 Nexenta에만 해당되며 다음에 설명되어 있습니다.http://lwn.net/Articles/334756/

GNU 대신 GNU

/usr/binNexenta의 기본 동작은 등에 설치된 GNU 유틸리티를 선호하는 것입니다 /usr/sbin. 이러한 유틸리티의 Sun 버전 /usr/sun/bin은 에 설치됩니다 /usr/sun/sbin. Nexenta는 GNU와 SUN 특성 사이를 전환할 수 있는 트릭을 사용합니다. 환경 변수 SUN_PERSONALITY가 1로 설정된 경우 사용자가 명시적으로 절대 경로(예: )를 통해 명령을 실행하더라도 검색 경로가 우선 /usr/sun/bin합니다 . 이를 통해 Solaris 기반 스크립트가 수정 없이 Nexenta에서 실행될 수 있습니다. Nexenta는 SVR4 패키지 명령에서도 이 기능을 사용합니다. SVR4 형식의 기본 Solaris 패키지를 설치하는 데 사용할 수 있으며, Alien을 호출하여 패키지를 Debian 패키지로 즉시 변환할 수 있습니다./usr/sun/sbin/usr/bin/sed

이것은 libc 어딘가에서 수행됩니다.

그래서,

$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
$ SUN_PERSONALITY=1 sed --version
sed: illegal option -- version

따라서 Java로 시작하는 스크립트는 SUN_PERSONALITY를 설정해야 합니다.

GNU 도구가 필요한 경우 스크립트에서 이를 설정 해제할 수 있습니다.

답변2

어떤 경우 에라도,

sed "0,/^local/{s/md5/trust/}"

GNU에 특정하며( 0이전의 주소 및 누락된 부분) 다른 구현과 함께 사용할 수 없습니다(Solaris는 기본적으로 GNU와 함께 제공되지 않습니다).;}sedsed

휴대용/표준:

sed '/^local/,$!s/md5/trust/'

로 시작하는 첫 번째 줄까지만 바꾸십시오(포함하지 않음) local. 또는:

awk 'NR == 1, /^local/ {gsub(/md5/,"trust")}; {print}'

(Solaris에서는 이것이 필요할 수 있습니다 command -p awk.)

첫 번째 일치하는 줄을 바꾸려면 다음을 수행하십시오 /^local/.

awk '/^local/ && ! seen {gsub(/md5/, "trust"); seen = 1}; {print}'

또는:

sed -e '/^local/!b' -e 's/md5/trust/g;:1' -e 'n;b1'

bashSolaris 및 Linux( 또는 ksh(또는 Solaris) 와 같은 POSIX 셸에서) POSIX 호환 유틸리티를 얻으려면 다음을 /usr/xpg4/bin/sh추가할 수 있습니다.

PATH=$(command -p getconf PATH):$PATH

스크립트 상단으로 이동합니다. 또는 command -pPOSIX 버전을 원하는 각 명령 앞에 추가하세요.

답변3

또 다른 휴대용 방법은 다음과 같습니다 sed.

sed 1i\\ file |
sed '1,/^local/s/md5/trust/;1d'

숨쉴 공간을 좀 주세요. 이렇게 하면 파일 시작 부분에 빈 줄이 삽입되므로 한두 가지에 의존할 수 있습니다.

다음과 같이 할 수도 있습니다.

{ echo; cat file; } |
sed '1,/^local/s/md5/trust/;1d'

관련 정보