Linux 및 Mac의 줄 끝

Linux 및 Mac의 줄 끝

"output"으로 시작하는 줄 다음에 작성된 경로를 찾는 텍스트 파일을 구문 분석하고 있습니다. 줄은 이렇습니다

output xyz/mypath/

추출하고 싶어요xyz/mypath 아니요마지막 슬래시.

내 Mac OS X(BSD) 및 Linux에서 이 경로를 얻으면 다른 동작이 나타납니다. basepath=cat $basefile | grep -e ^output\ | cut -d" " -f2 | rev | sed 's@/$@@' | rev

까다로운 부분이 있는 것 같습니다.

sed 's@/$@@

Mac에서는 작동하지만 Linux에서는 작동하지 않습니다. 내가 하면 그 반대

sed 's@/@@ Mac(BSD)이 아닌 Linux에서 작동합니다.

이 트릭은 라인 끝 char$와 관련이 있는 것으로 보입니다. 이는 다르게 관리됩니다(아마도 cat 수준에서). Mac 및 Linux 콘솔 모두에서 작업을 수행하는 방식으로 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?

답변1

나는 OSX 머신에 쉽게 접근할 수 없지만 어쨌든 당신의 접근 방식은 불필요하게 복잡합니다. 다음과 같이 수행하십시오(실제 입력에 따라).

basepath=$(grep ^output "$basefile" | awk '{print $NF}' | sed 's/[/]$//'

또는

basepath=$(awk '/^output/{print $2}' "$basefile" | sed 's/[/]$//')

심지어

basepath=$(grep -oP '^output\s+\K.+(?=/)' "$basefile")

또는

basepath=$(perl -lne 'print $1 if /^output\s+(.+)\//' "$basefile";

답변2

내가 아는 한, 이것은 Linux에서 작동해야 합니다( 적어도 구문은). 그러나 패턴 공간에서 무슨 일이 일어나고 있는지 sed알고 싶다면 다음을 살펴봐야 합니다.sedl

sed 'l;s|/$||;l'

나는 당신이 다음과 같이 모든 일을 할 수 있다고 생각합니다 sed:

basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")

답변3

나는 추천한다

sed -n '/^output / {s///; s,\(.*\)/,\1,p}'

GNU 및 OSX sed에서 작동해야 합니다.

의 빈 정규식은 s///이전 정규식을 재사용합니다( /^output /).

관련 정보