특정 위치의 특정 문자를 제거하는 쉘 스크립트

특정 위치의 특정 문자를 제거하는 쉘 스크립트

다음 데이터를 가정하십시오. 이해를 돕기 위해 아래 열 29 위치를 사용하고 있습니다. 위치 29가 문자나 숫자로 시작하는지 확인하고 싶습니다. 예를 들어 첫 번째 행에서 문자 "U"를 삭제해야 한다면 두 번째 행 "D"를 삭제해야 하며 세 번째 행은 숫자로 시작하므로 아무 것도 할 필요가 없습니다.

47720920010500002           U314178
37966744783100812           D123455
37966880762200334           356678

나는 다음을 시도했다

sed 's/^\(.\{212\}\)U/\&/' $file_name   

...212번째 문자 "U"를 공백으로 바꿉니다.

cut -c -211,213- $file_name 

...위치 212에서 공백을 제거합니다.

상수 U인 경우 이 코드가 작동합니다. az의 모든 aplhabets를 확인하려면 명령(있는 경우)에 대한 도움이 필요합니다.

답변1

귀하는 다음과 밀접한 관련이 있습니다.

sed 's/^\(.\{212\}\)U/\&/' $file_name

를 사용하여 처음 212자를 캡처했습니다 \(...\). 당신이 해야 할 일은 \1교체에서 해당 콘텐츠를 참조하는 것뿐입니다. literal 을 포함 &하여 일치하는 전체 텍스트로 대체됩니다 U.\&&

또한 212번째 문자를 제거하는 경우 212자가 아닌 이전 211자를 일치시키는 것입니다.

그래서:

sed 's/^\(.\{211\}\)U/\1/' < "$file_name"

또는:

sed -- 's/^\(.\{211\}\)U/\1/' "$file_name"

(또한 누락된 따옴표를 추가 $file_name하고 파일 이름이 다음으로 시작하는 것을 방지하는 두 가지 다른 방법을 보여주었습니다 -(첫 번째 방법은 이름이 지정된 파일에도 작동하고 -파일을 열 수 없는 경우 실행을 방지하므로 더 좋습니다).sed

U단일 문자 와 일치하도록 바꾸십시오 [[:alpha:]](글쎄, 인간 언어 스크립트에 사용되는 그래픽 기호는 문장 부호가 아닙니다). 또는 [[:upper:]]대문자 또는 ASCII 문자의 경우(아니요, 이는 일반적으로 /와 같은 문자를 포함하는 것과 동일하지 않으며 일부 로케일에서는 /와 같은 다중 문자 조합 요소일 수도 있습니다 [ABCDEFGHIJKLMNOPQRSTUVWXYZ]).[A-Z]ÆÊDZSDzs

답변2

awk테스트 및 절단 가능:

awk '! /^[[:alpha:]]/ { print; next; }
{ print substr ($0, 1, 211) substr ($0, 213); }'

더 짧은 데이터로 테스트합니다(네 번째 위치 제거).

답변3

POSIX awk를 사용하십시오.

$ awk 'substr($0,29,1) ~ /[[:alpha:]]/{ $0=substr($0,1,28) substr($0,30) } 1' file
47720920010500002           314178
37966744783100812           123455
37966880762200334           356678

답변4

사용행복하다(이전 Perl_6)

raku -pe 's/ ^ .**28 <(<alpha>)> //;' 

또는

raku -pe 's/ ^ .**28 <(<:L>)> //;'  

위는 처음 28자 이후 29번째 문자가 <alpha>(첫 번째 예) 인지 <:L>(유니코드 문자, 두 번째 예)인지 확인합니다. Character 클래스 <:L>는 의 약자로 <:Letter>, 둘 다 사용할 수 있습니다.

기술적으로는 <alpha>알파벳 문자와 밑줄(_)을 일치시킵니다. 반면에 문자 클래스는 <:L>유니코드 유니버설 클래스 이름을 사용합니다.

위 정규식은 캡처 태그 ... 를 사용하여 OP가 생략하려는 / 문자 이외의 <(식별된 요소를 제거합니다 .)><alpha><:L>

입력 예:

47720920010500002           U314178
37966744783100812           D123455
37966880762200334           356678

예제 출력:

47720920010500002           314178
37966744783100812           123455
37966880762200334           356678

https://raku.org

관련 정보