내가 하려는 일은 다음과 같습니다. 이 모델에는 파일이 있고 그 안에 줄이 있습니다(분명히 100% 있을 것입니다).
name_of_the_value=xxx
가치가 있는 곳숫자그리고 알려지지 않은장치와 장치 간에 변경되기 때문에 나에 의해... 어떻게든 값을 가져 xxx
와서 사용자가 제공한 다른 값으로 바꿔야 합니다. TextField
(저는 이를 위해 Java를 사용하고 있으며 Android 애플리케이션용이지만 어쨌든 순수한 쉘 스크립트).
유효함:
- 전체 줄을 찾아 삭제하고 전체 줄로 바꿉니다. 예를 들어 삭제
name_of_the_value=xxx
하고 다음으로 바꿉니다.name_of_the_value=user_value
xxx
(값) 부분 만 교체- 일치하는 기존 행을 '#'으로 주석 처리하고 파일 맨 아래에 전체 행을 작성합니다.
하지만 을 어떻게 사용할 수 있습니까 echo
? sed
아니면 awk
값을 모르는 경우에는 어떻게 해야 합니까?
답변1
user_value 부분의 길이가 항상 3자라고 가정하면 다음과 같이 할 수 있습니다.
sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"
또는 해당 줄 뒤에 아무 것도 없다고 확신하는 경우 다음을 사용할 수도 있습니다.
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"
나는 REGEX를 올바르게 얻었기를 바랍니다. 나는 이것에 대한 전문가가 아닙니다. 따라서 값은 항상 16진수 형식에서 가장 좋은 3자 길이여야 합니다. 왜냐하면 100 미만의 경우 소수는 항상 3자가 아니기 때문입니다. 두 번째 경우는 숫자가 100 미만인 경우에도 작동해야 하지만 전체 name_of_the_value=user_value
부분이 다음과 같다고 가정합니다. 그 자체의 라인. 이제 터미널에서 이것을 테스트하면 두 번째 경우의 출력은 다음과 같습니다.
video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video
물론 출력을 다시 파일로 파이프하거나 임시 파일을 사용하여 바꿔야 합니다. 다음을 사용할 수 있습니다.
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file
Sed는 파일을 쓰는 동안이 아니라 읽는 동안에만 출력을 변경하며, 스폰지는 사용자가 완료할 때까지 출력을 저장하고 변경 사항을 다시 씁니다.
두 번째 파일에서 스폰지 쓰기를 사용하고 싶지 않거나 사용할 수 없는 경우 이 명령 체인처럼 전환하세요.
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file
@kos가 주석에서 지적했듯이 명령 -i
의 플래그를 사용하여 sed
임시 파일을 사용하지 않고 입력 파일에 다시 쓸 수도 있습니다 sponge
.
sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file