다음 데이터를 가정하십시오. 이해를 돕기 위해 아래 열 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]
Æ
Ê
DZS
Dzs
답변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