
파일에서 문자열의 일부를 검색하고 전체 줄을 바꾸거나 문자열을 찾을 수 없는 경우 파일에 문자열을 추가하는 방법에 대한 제안을 찾고 있습니다. 나는 한동안 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