![sed는 왼쪽에 0으로 채워진 숫자의 모든 항목을 내장된 빼기 기호 "-"로 대체하여 빼기 기호가 왼쪽에 있도록 합니다.](https://linux55.com/image/141850/sed%EB%8A%94%20%EC%99%BC%EC%AA%BD%EC%97%90%200%EC%9C%BC%EB%A1%9C%20%EC%B1%84%EC%9B%8C%EC%A7%84%20%EC%88%AB%EC%9E%90%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EB%82%B4%EC%9E%A5%EB%90%9C%20%EB%B9%BC%EA%B8%B0%20%EA%B8%B0%ED%98%B8%20%22-%22%EB%A1%9C%20%EB%8C%80%EC%B2%B4%ED%95%98%EC%97%AC%20%EB%B9%BC%EA%B8%B0%20%EA%B8%B0%ED%98%B8%EA%B0%80%20%EC%99%BC%EC%AA%BD%EC%97%90%20%EC%9E%88%EB%8F%84%EB%A1%9D%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
탭으로 구분된 입력 파일이 있습니다. 일부 숫자 필드 값에는 값 중간에 빼기 기호가 있습니다(예: ) 000-45.123
. 나는 -
다음과 같이 왼쪽에 있어야합니다 : -00045.123
따라서 탭으로 구분된 입력 파일에 다음이 포함된 경우: (공백은 탭입니다)
ABC 000-45.123 0-765.43 DEF 00-54 XYZ
그럼 내가 원하는 결과는
ABC -00045.123 -0765.43 DEF -0054 XYZ
"-"가 포함된 모든 숫자 값은 하나 이상의 0으로 시작하고 다른 문자는 없습니다.
참고: 사용 가능한 옵션이 없습니다: sed -r 또는 sed -E
답변1
GNU sed 사용:
숫자 및 빼기 기호에서 빼기 기호 및 숫자로 순서를 변경합니다.
sed -r 's/([0-9]+)(-)/\2\1/g' file
산출:
ABC -00045.123 -0765.43 DEF -0054 XYZ
바라보다:스택 오버플로 정규식 FAQ
답변2
POSIX적으로:
TAB=$(printf '\t')
sed "s/^\(00*\)-/-\1/;s/${TAB}\(00*\)-/$TAB-\1/g"
00-
첫 번째 필드( 줄 시작 부분) 또는 다른 필드( 00-
TAB 뒤) 의 두 가지 경우를 고려해야 합니다 .
sed
구현 지원 -E
(확장 정규 표현식용) 및 셸 지원 $'...'
(모두 POSIX 사양의 향후 버전이 될 가능성이 높음)을 사용하면 이를 다음과 같이 단순화할 수 있습니다.
sed -E $'s/(^|\t)(0+)-/\1-\2/g'
대신에.