2012-09-24 4 views
0

내 문제는 간단하지만 sed 표현으로 변환하는 것이 놀랍지 않게 어렵다는 것을 알았습니다.두 개의 토큰 사이에서 sed의 전역 변환

파일의 특정 토큰 사이에 이름을 '밑줄'을 써야합니다. 따라서 회선에 :=이 있으면이 두 토큰 사이에 'multi word_name'을 'multi_word_name'으로 변환해야합니다.

토큰 사이에 두 단계 일치를 적용하고 전역 변수를 밑줄로 대체하는 것이 매우 쉽지만 파일에 다시 기록 할 때 행의 일치하지 않는 부분을 유지할 방법을 찾을 수는 없습니다.

+0

이 라인이'한 쌍의 이상을 포함 할 수 있습니다? –

+0

아니요 - 단지 한 쌍 –

답변

2

sed 's/:[^=]*=/$(tr " " "_" <<<"&")/g;s/.*/echo "&"/e' file 

을하거나 나오지 사용 : 당신을 위해 오크는 (GNU는 TR 및 bash에 나오지도)`와`=`토큰 :

sed ':a;/:[^_=]*=/!b;s//\n&\n/;h;s/.*\n\(.*\)\n.*/\1/;y/ /_/;H;g;s/\n.*\n\(.*\)\n\(.*\)/\2\1/;ta' file 
2

당신은 sed 두 호출 함께 할 수있는 :

echo 'pre with space :multi word name=post with space' \ 
| sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n' 

파일에이 작업을하려면 (bash는) 이런 짓을 할 것이다 :

while read; do 
    echo "$REPLY" | sed 's/[:=]/\n&/g' | sed '/^:/s/ /_/g' | tr -d '\n' 
    echo 
done < infile 

비록 awk을 것입니다 작업에 더 적합한 도구가 될 수 있습니다.

awk -F '[:=]' '{ gsub(" ", "_", $2); print $1 ":" $2 "=" $3 }' infile 
관련 문제