긴 텍스트를 sed를 사용하여 특수 문자로 바꾸십시오.

긴 텍스트를 sed를 사용하여 특수 문자로 바꾸십시오.

나는 파일의 일부 텍스트를 특수 문자로 바꾸기 위해 유닉스에서 sed를 사용하고 있습니다. Google에서 다음 명령을 찾았습니다.

sed 's/from/to/g' file.txt

여기서 'from'은 대체되는 원본 텍스트이고, 'to'는 대체 텍스트입니다.

특수 문자가 포함된 긴 텍스트가 있는 파일에 이 내용을 적용하려고 합니다. 즉, "/D/dec/prog/g++.exe -Wall --std=c++0x"(인용문 제외)를 "SYSTEM_PATH/BIN"으로 바꾸는 것입니다. , 다음을 시도했지만 작동하지 않습니다

sed 's//D/dec/prog/g++.exe   -Wall --std=c++0x/SYSTEM_PATH/BIN/g' file.txt

하지만 "sed: -e 표현식 #1, 문자 10: `s'에 대한 알 수 없는 옵션" 오류가 발생합니다.

저는 유닉스 초보자이지만 어떤 이유로 일부 파일을 처리하기 위해 유닉스 서버에 원격으로 로그인해야 합니다. 나는 알고 싶다

1) FROMSTR = '/D/dec/prog/g++.exe -Wall --std=c++0x' TOSTR = 'SYSTEM_PATH/BIN'과 같이 변수에 대한 시작 및 끝 문자열을 정의하는 방법은 무엇입니까?

sed 's/$FROMSTR/$TO/g' file.txt와 같이 sed를 호출할 수 있습니다.

하지만 sed는 그것을 변수로 해석하는 방법을 모르는 것 같습니다.

2) sed로 텍스트를 바꾼 후 결과를 원본 파일에 다시 쓰지 않습니다. 어떻게 작동하게 만들까요?

답변1

대체 명령은 그렇지 않습니다.필요/구분 기호로 사용합니다 .

sed 's!/D/dec/prog/g++.exe   -Wall --std=c++0x!SYSTEM_PATH/BIN!g' file.txt

답변2

질문의 지침을 따르십시오. 먼저 가지고 있는 것과 대체될 것을 설정하십시오.

(base) localhost:~ # FROMSTR='/D/dec/prog/g++.exe -Wall --std=c++0x'
(base) localhost:~ # echo $FROMSTR
/D/dec/prog/g++.exe -Wall --std=c++0x
(base) localhost:~ # TOSTR='SYSTEM_PATH/BIN'
(base) localhost:~ # echo $TOSTR
SYSTEM_PATH/BIN

그런 다음 sed를 실행할 파일을 만들었습니다.

(base) localhost:~ # cat > testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3

그런 다음 변수를 호출하는 sed를 실행하지만 첫 번째 변수에는 echo를 사용해야 합니다.

(base) localhost:~ # sed -e "s|`echo $FROMSTR`|$TOSTR|" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2/D/dec/prog/g++.exe -Wall --std=c++0x2
3SYSTEM_PATH/BIN3
(base) localhost:~ # sed -e "s|$FROMSTR|$TOSTR|g" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3

이것이 작동하려면 몇 가지 사항이 있습니다.

  • 우리가 익숙한 /의 sed 구분 기호를 | 또는 두 변수 중 하나에서 사용하지 않는 것으로 바꾸십시오.
  • 작은따옴표 '를 사용하면 변수는 내용이 아닌 이름으로 읽혀집니다. $TOSTR은 SYSTEM_PATH/BIN이 아닌 $TOSTR입니다.
  • 변수를 해석하려면 큰따옴표를 사용하십시오.

sed가 대체 파일을 사용하여 파일을 다시 쓰도록 하려면 sed 옵션에 -i를 추가해야 하지만 제안되는 것은 >를 사용하여 출력을 새 파일로 리디렉션하는 것입니다.

(base) localhost:~ # sed "s|$FROMSTR|$TOSTR|g" testSED > testSEDdone
(base) localhost:~ # cat testSEDdone
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
(base) localhost:~ # cat testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
(base) localhost:~ # sed -i "s|$FROMSTR|$TOSTR|g" testSED
(base) localhost:~ # cat testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3

관련 정보