다음과 같은 줄이 포함된 test.txt 파일이 있습니다.
values = abc, def, dfg, ert, sdf, sfd, sdf
test,txt의 값에 새로운 쉼표로 구분된 값을 추가하기 위해 쉘 스크립트를 사용하고 있습니다.
예를 들어, 나는 필요하다다음에 추가test.txt의 "ghf":
values = abc, def, dfg, ert, sdf, sfd, sdf, ghf
값도 제거해야 합니다.
예를 들어, 내가 필요한 경우제거하다test.txt의 "ert":
values = abc, def, dfg, sdf, sfd, sdf, ghf
쉘 스크립트에서 이를 어떻게 달성할 수 있습니까?
(즉)
내가 주면
echo "abc" >> test.txt
파일 끝에 "abc"를 추가할 수 있지만 test.txt의 "values=" 필드에 추가해야 합니다.
고마워,
해리
답변1
극단적인 상황에 대비하지 않고 빠른 솔루션을 제공합니다.
(감사해요글렌 잭맨최적화 에 사용됩니다 sed
. )
다음에 추가
sed -i "/^values = / s/$/, ${NEW_VALUE}/" test.txt
설명하다
sed -i
- 로 인쇄하지 않고 지정된 파일을 변경합니다 stdout
.
/^values = /
- sed
로 시작하는 줄에 있을 때 values =
.
s/$/, ${NEW_VALUE}/
- , ${NEW_VALUE}
줄 끝에 추가됩니다.
test.txt
sed
-작업이 수행될 파일입니다.
제거하다
sed -i "/^values = / s/ ${REMOVE_VALUE},\?//" test.txt
설명하다
s/ ${REMOVE_VALUE},\?//
- 첫 번째 항목 ${REMOVE_VALUE}
과 선택적 후속 항목을 제거합니다 ,
.
이 솔루션의 문제점
- 첫 번째 값을 추가하면
,
즉시 추가됩니다.values =
- 마지막 값을 제거하면 .로 끝나는 줄이 남습니다
,
. - 추가/제거된 변수에 명령
sed
의 구분 기호s
(예제에서는 해당/
)가 포함되어 있으면 명령이 작동하지 않습니다.
답변2
사용하면 ed
다음을 수행할 수 있습니다.
ed -s test.txt <<<$'/values/s/$/,ghf\nw' # add ghf to the end of line
그리고
ed -s values <<<$'/values/s/ert,//\nw' # remove ert