탭으로 구분된 입력 파일이 있습니다. 일부 숫자 필드 값에는 값 중간에 빼기 기호가 있습니다(예: ) 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'
대신에.