2016-10-05 2 views
0

방금 ​​배쉬를 배웠습니다. 현재 내 프로젝트에서 일하고 있고 sed를 사용할 때 문제가 생겼습니다. 웹에서 도움을 구하려고했지만 기쁨이 없었습니다. 나는 내가 찾고있는 것을 찾을 수 없기 때문에 올바른 용어를 사용하지 않을 수도 있다고 생각합니다. 아무리 해도.sed - 공백이 포함 된 변수가있는/c 가있는 행 삽입

그래서 내 스크립트에서 변수에 date의 출력을 할당하려고합니다. 내 대본의 줄이있다. 내가 그것을 호출하면

origdate=$(date) 

출력은 다음과 같습니다 : 내 스크립트의

Wed Oct 5 19:40:45 BST 2016 

일부는 다음 파일을 생성하고 여기에 정보를 기록, 부분은 어느 I 라인을 찾기 위해 sed를 사용하는 것을 시도하고있다 그것의 부분을 교체하십시오. 이것은 내가 sed로 놀아 본 첫 번째이며, 지금까지 나의 필요를 위해 성공적으로 사용 해왔다. 그러나 나는이 때 나는 갇히지 해요 : 나는 스크립트를 실행하고이 선에 도달 할 때

sed -i '/origdate=empty/c\'$origdate'' $sd/pingcheck-email-$job.txt 

, 이것이 내가지고있어 오류입니다 :

sed: can't read Oct: No such file or directory 
sed: can't read 5: No such file or directory 
sed: can't read 19:52:56: No such file or directory 
sed: can't read BST: No such file or directory 
sed: can't read 2016: No such file or directory 

내가 의심이 뭔가 날짜 (변수)의 공백을 사용하여, 내 질문은 : 어떻게이 문제를 해결할 수 있습니까? 공간을 '무시'하도록 sed 할 수 있습니까? 아니면 단지 cut을 사용하여 날짜 필드를 자르고 그 변수와 동일한 변수를 다시 설정하여 다른 변수에 시간을 설정해야합니까? 누군가 나를 친절하게 올바른 방향으로 향하게 할 수 있다면 좋을 것입니다!

미리 감사드립니다.

답변

1

따옴표 변수

sed -i '/origdate=empty/c\'"$origdate"'' $sd/pingcheck-email-$job.txt 

또는 대안 적으로,

sed -i "/origdate=empty/c\$origdate" $sd/pingcheck-email-$job.txt 
+0

큰 따옴표로 대괄호를 사용했습니다. 고마워요. 시간을 내면 더 많은 sed 함수 등을 쓸어 버릴 것 같아요.하지만 지금 내 도움이됩니다. - 많은 감사합니다! – keefer

0

당신은 이중 슬래시 탈출 필요한 모든 스크립트 \/\ %

+0

고마워요 - 지금은 큰 따옴표로 갔지만이 대답은 sed에서 브러시를 불러 일으키고 좀 더 기능이 있으므로 나중에이 프로젝트를 사용할 때 사용합니다. 그렇게하는 방법에 대한 더 많은 지식. 당신의 도움에 많은 감사드립니다! – keefer

1

문제는 sed하지 않지만 오히려 bash 단어가 당신의 명령에 주어진 날짜에 어떻게 나뉘어 지는지.

배시에서

은, 단어 분할은 텍스트가 인수 목록으로 분리되도록 명령 줄에서 수행됩니다. 설명하기 위해 첫 번째 인수 만 출력하는 간단한 스크립트를 실행합니다. 인수로서 (귀하의 경우에는 나오지도) 명령으로 bash -c 'echo $1' ignored_0foo bar

bash -c 'echo $1' ignored_0 foo bar 

생각합니다. 이 경우 foo bar은 두 개의 인수 foo와 bar로 나뉩니다.

foo bar을 첫 번째 매개 변수로 전달하려면 텍스트를 작은 따옴표 나 큰 따옴표로 묶어야합니다. GNU manual on quoting을 참조하십시오.

bash -c 'echo $1' ignored_0 'foo bar' 
bash -c 'echo $1' ignored_0 "foo bar" 

변수가 작은 따옴표 안에 있으면 매개 변수 확장이 수행되지 않습니다.

var="foo bar" 
bash -c 'echo $1' ignored_0 '$var' 
bash -c 'echo $1' ignored_0 "$var" 

참고 : 명령에서`bash는 -c '에코 $ 1', 내가 전에 가 내가 실행하고자하는 코드의 일부이기 때문에 비난하는 인수로 전달되는 확장하려면 $ 1을 원하지 않는다.

변수 확장은 변수가 따옴표 밖에있을 때 발생하지만 매개 변수가 확장 된 후에 단어 분할이 적용됩니다. 말씀 분할 섹션에서 bash는 남자 페이지에서 :

쉘은 매개 변수 확장의 결과를 검색, 대체하고, 단어 분할을위한 따옴표 내에서 발생하지 않았다 산술 확장을 명령. GNU bash manual on Word Splitting에서

:

쉘은 매개 변수 확장의 결과를 스캔은 대체하고, 단어 분할을위한 따옴표 내에서 발생하지 않았다 산술 확장을 명령.

var="foo bar" 
bash -c 'echo $1' ignored_0 $var 

인용되지 않은 인용 부호가 명령에 전달되기 전에 제거 Quote Removal에서 쉘 확장 횟수의 마지막 단계. 다음 명령은 " '" "이 전달 된 인수에 영향을 미치지 않는다는 것을 보여줍니다. 당신의 예에서

bash -c 'echo $1' ignored_0 foo''"" 

응용 프로그램

, $의 origdate 후 후행 ''는 관계없는 것입니다. 중요한 부분은 $ origdate가 인용되지 않기 때문에 단어 분리가 확장 변수에 적용된다는 것입니다. 나오지도

-e는 sed 명령에 전달 하지이며, 표현이 bash에서 하나 개의 인수, 또는 단어에있을 것으로 예상하고있다. 명령을 실행할 때 표현식은 /origdate=empty/c\Wed이고 나머지 날짜는 표현식이 적용될 파일로 간주됩니다.

간단한 해결 방법은 단어 분리를 방지하려는 문자열 주위에 큰 따옴표를 넣는 것입니다. 누구나 시스템에 파일이 없어도이 예제를 실행할 수 있도록 명령을 수정했습니다.

$의 경우 이스케이프 문자로 간주되지 않도록 \을 이스케이프 처리해야합니다.

echo "origdate=empty" | sed "/origdate=empty/c\\$origdate" 

단어 분리에 영향을주지 않고 사용중인 따옴표 유형을 변경할 수도 있습니다.

echo "origdate=empty" | sed '/origdate=empty/c\'"$origdate" 
+0

답변 해 주셔서 대단히 감사합니다!일어난 일에 대해 너는 훨씬 더 큰 이해를 주었다. 매우 감사! – keefer

+0

환영합니다. 나는 표를 높이 평가할 것이다. –

+0

나는 이미 투표를했는데 내 평판이 충분하지 않아 아직 계산되지 않았다. 내 명성이 충분히 높을 때 돌아올거야. 다시 한번 감사드립니다. – keefer

관련 문제