리눅스와 맥에서는 줄 끝

리눅스와 맥에서는 줄 끝

"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 /) 을 재사용합니다.

관련 정보