2012-10-23 2 views
0

배관 문제를 파악하려고합니다.배관으로 명령을 입력하십시오.

<link href="main.css" /> 

이에 :

을 main.css가의 출력이

main.css:main.min.css 

이며 index.html을이에서 갈 경우 내 목표는이

replace $1 $2 index.html | split -d ':' | minify main.css 

같은 것입니다

<link href="main.min.css" /> 

간단한 예입니다. w,하지만 내 문제를 설명하는 것 같아. 1

좋아

  • 편집, 내가 잘못된 방향으로 주위의 배관을 가지고,하지만 난 여전히 알아낼 수 없습니다.

    여기에 간단한 예를

    echo 'foo:bar' | split -d ':' | replace $1 $2 -- index.html 
    

    명령의 종류 가능합니다입니까?

    • 편집 2

    너무 가까이!

    minify css/main.css | replace $(cut -f1 -) $(cut -f2 -) index.html 
    

    이 그들이 올바른 값을 반환하는 :(STDIN를 읽을 수 없습니다 어떤 이유로 인하 것을 제외하고 일하는 것이 일반적으로 실행할 때하지만 난하지 않는 명령을

+0

나는 당신이 주변에 파이프 라인 길을 잘못 찾은 것 같아. 그것은 영어와 같이 왼쪽에서 오른쪽으로 흐릅니다. – jurgemaister

+0

멋지다. 게시물을 업데이트했습니다. –

답변

1

를 교체에 대한 인수로 필요 두 개의 다른 소스 (파이프뿐만 아니라 입력 파일)에서 입력을 읽으려고하고 있기 때문에 당신이 한 라이너이 할 수 있다고 생각합니다 이런 식으로 뭔가가 작동하지 않을 수 있습니다,하지만 :.

IFS_SAVE=$IFS 
IFS=: a=(`echo "foo:bar"`) 
sed -i "s/${a[0]}/${a[1]}/g" index.html 
IFS=$IFS_SAVE 

IFS=: 명령은을 변경합니다. 0을 사용하여 newline에서 :으로 바꾸십시오. 따라서 중첩 된 echo은 두 개의 필드를 bash 배열 (...)에 넣습니다. 배열 요소는 다음과 같이 액세스 할 수 있습니다. ${varname[index]}

sed -i이 파일에서 대체됩니다. 당신이 원하지 않는 경우, -i을 제거하고 새 파일에 출력을 리디렉션 :

sed "s/${a[0]}/${a[1]}/g" index.html > output.html 
+1

IFS를 사용하여 단축 할 수 있습니다. IFS = : a = ('echo "foo : bar"')''' (https://en.wikipedia.org/) wiki/Internal_field_separator) – Marian

+0

@Marian 좋은 지적. 결정된. –

+0

'IFS'는 적어도 내 시스템에서는 그 라인 다음에':'로 남아 있습니다. – doubleDown

0
IFS=: read -ra a <<<'foo:bar' 
ed -s index.html <<EOF 
g/${a}/s,,${a[1]} 
w 
EOF 
관련 문제