"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
알고 싶다면 다음을 살펴봐야 합니다.sed
l
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 /
).