파일의 문자열로 줄 바꾸기 또는 추가

파일의 문자열로 줄 바꾸기 또는 추가

파일에서 문자열의 일부를 검색하고 전체 줄을 바꾸거나 문자열을 찾을 수 없는 경우 파일에 문자열을 추가하는 방법에 대한 제안을 찾고 있습니다. 나는 한동안 sed를 "놀이"해왔지만 예상대로 작동하도록 할 수 없습니다.

다음을 추가해야 합니다.

/swapfile   none    swap    sw    0   0

/etc/fstab( 에Ubuntu 14.04 - 신뢰할 수 있는 Tal).

상황:

  • /swapfile다음으로 시작하는 줄이 있으면 /etc/fstab해당 줄을 삭제하고 위에 제공된 문자열로 바꿉니다.
  • 로 시작하는 줄을 두 개 이상 찾으면 /swapfile모두 제거하고 위 문자열을 파일 끝에 추가하세요.
  • /swapfile에 없으면 문자열 /etc/fstab을 다음에 추가합니다./etc/fstab
  • 명령은 콘솔 출력을 표시해서는 안 되며 "한 줄"이어야 합니다(Puppet의 자동화 목적으로 인해).

나는 이것이 가능하다고 생각하지만 필요한 방식으로 sed를 사용하는 것과 관련된 튜토리얼을 찾지 못했습니다.

나는 사용했지만 sudo sed -i '$a/swapfile none swap sw 0 0' /etc/fstab 문자열 만 추가했습니다 :(

답변1

sed를 사용하여 이 작업을 수행할 수 있습니다. Turing Complete입니다. 그러나 이는 작업에 가장 적합한 도구는 아닙니다. Sed에는 교체되었음을 기억하는 편리한 방법이 없습니다.

sed로 비교적 쉽게 할 수 있는 일은 로 시작하는 모든 줄을 비우고 /swapfile끝에 새 줄을 추가하는 것입니다.

sed -i '$! s/^\/swapfile[\t ]//; $s/\(^\/swapfile.*\)\?$/\n\/swapfile none swap sw/' /etc/fstab

그러나 그 외에도 우리는 이와 같은 sed 코드를 다른 시스템 관리자에게 유지 관리하도록 맡기지 않을 영역에 빠르게 진입했습니다. 특히 간단하고 읽기 쉬운 셸 명령의 조합이 훨씬 더 나은 작업을 수행할 때 더욱 그렇습니다.

{ </etc/fstab grep -v '/swapfile[\t ]'; echo '/swapfile none swap sw'; } >/etc/fstab.new && mv /etc/fstab.new /etc/fstab

/swapfile줄의 기존 위치(존재하는 경우)를 유지하고 수정이 필요할 때만 파일을 수정하려면 쉘 논리와 awk의 조합이 더 나은 도구입니다. 여기서는 명확성을 위해 여러 줄을 사용하고 있지만 원하는 경우 모든 코드를 같은 줄에 넣을 수 있습니다. 보너스로, 파일에 이미 예상되는 줄(정확한 간격 포함)이 포함되어 있으면 수정되지 않습니다.

awk '
  /\/swapfile[\t ]/ {if (replaced) {next}
                     else {replaced=1; print "/swapfile none swap sw"}}
  1 {print}
  END {if (!replaced) print "/swapfile none swap sw"}
' /etc/fstab >/etc/fstab.new &&
if cmp -s /etc/fstab.new /etc/fstab.new; then
  rm /etc/fstab.new;
else
  mv /etc/fstab.new /etc/fstab;
fi

답변2

이를 자동화하기 위해 Puppet을 사용하고 있으므로 Puppet이 fstab이를 처리하도록 하는 것이 가장 좋습니다. 사용마운트 리소스 유형.

그것은 다음과 같습니다:

mount{'swapfile':
    name    => 'none',
    fstype  => 'swap',
    ensure  => mounted,
    atboot  => true,
    device  => '/swapfile',
    options => 'sw',
}

작동해야합니다.

만약 이것이 반드시 한 줄로 이루어져야 한다면(기록을 위해,나는 아직도 반대한다), 다음이 perl도움이 될 것입니다:

perl -pi -e 'BEGIN{$string = "/swapfile   none    swap    sw    0   0"} s!^/swapfile.*!$string! && $x++;END{print "$string\n" unless $x}' /etc/fstab

명확성을 위해 다음과 같이 줄로 나눴습니다.

perl -pi -e '
             BEGIN{$string = "/swapfile   none    swap    sw    0   0"}
             s!^/swapfile.*!$string! && $x++; # Modify line if it exists
             END{print "$string\n" unless $x} # Append it if it wasn't found
            ' /etc/fstab

관련 정보