![3행 끝에 경로를 삽입하는 방법](https://linux55.com/image/159399/3%ED%96%89%20%EB%81%9D%EC%97%90%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%82%BD%EC%9E%85%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
이름이 DRC.txt
.인 아래 표시된 파일을 고려하십시오. 이 파일의 내용은 다음과 같습니다.
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"
action $a set_parameter "options"
이제 이라는 변수가 생겼습니다 ruledeck = /praj/test/drc_tsn/test1
. DRC.txt의 세 번째 줄 끝에 경로인 이 변수의 값을 추가해야 합니다. 를 사용하여 이를 시도했지만 sed
경로는 추가되지 않고 변수만 추가됩니다. 위의 문제를 어떻게 해결할 수 있나요?
sed -i -e '3s/$/"$ruledeck"/' DRC.txt
이 명령의 출력은 다음과 같습니다.
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" $ruledeck
action $a set_parameter "options"
나는 다음과 같은 출력을 원합니다 :
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"
답변1
여기에는 두 가지 문제가 있습니다. 첫째, sed
명령이 작은따옴표( ''
)로 묶여 있으므로 변수가 확장되지 않습니다.
$ echo $ruledeck
/praj/test/drc_tsn/test1
$ echo '$ruledeck'
$ruledeck
명령에서 변수를 큰따옴표로 묶은 것을 알 수 있지만 sed
전체가 작은따옴표이므로 아무 것도 변경되지 않습니다. 대신 큰따옴표를 사용해야 합니다.
sed -e "3s/$/$ruledeck/" file
그러나 이것도 중단됩니다.
$ sed -e "3s/$/$ruledeck/" file
sed: -e expression #1, char 8: unknown option to `s'
이는 변수에 가 포함되어 있지만 이를 대체 연산자( ) 에 대한 구분 기호 로 /
도 사용하고 있기 때문입니다. 다른 구분 기호가 필요합니다. 이렇게 하면 원하는 작업이 수행됩니다./
s///
$ sed -e "3s|$|$ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"/praj/test/drc_tsn/test1
action $a set_parameter "options"
그러나 줄 끝에 공백이 없으면 이는 여전히 정확하지 않습니다. 공백이 아직 없는 경우 추가하려면 \?
(공백 및 이스케이프된 물음표)를 사용하여 "0 또는 1 공백"과 일치시킵니다. 이 모든 것을 종합하면 다음과 같습니다.
$ sed -e "3s| \?$| $ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"
답변2
3행 뒤에 행을 추가 한 다음 3행을 새 4행과 연결하면 ed
따옴표 및 정규식 구분 기호 관련 문제를 피할 수 있습니다. 예를 들어
printf "%s\n" 3a " $ruledeck" . 3,4j wq | ed -s DRC.txt
printf "%s\n"
나머지 인수 각각을 ed
한 번에 하나씩 텍스트 편집기로 파이프하는 데 사용됩니다.
ex
or vi -e
( vim -e
또는 vim -E
)를 대신 사용할 수 있습니다 ed
. 그러나 ex
다양한 구현에서는 줄을 연결할 때 공백을 삽입하는 반면 while은 그렇지 않습니다(따라서 인용된 문자열의 시작 부분에 공백을 추가할 필요가 없습니다). 해당 프로그램 및 기타 관련 프로그램은 동일한 기본 편집 명령을 구현하지만 다음과 같은 몇 가지 주요 미묘한 차이점이 있습니다.vi
ed
" $ruledeck"
sed
qed1965. 일부는 이러한 명령에 대한 중요한 확장도 제공합니다.