이 문제를 해결하기 위해 grep, awk 및 sed를 사용하고 있습니다. 다음과 같은 줄이 포함된 XML이 있습니다.
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" database_fieldname="LONG" allowsnull="false"/>
해당 값이 있는 행을 분리하고 싶습니다.이름 =그리고데이터베이스 필드 이름 =동일하다면 전체 필드를 삭제하세요.데이터베이스 필드 이름 =.예상 출력:
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" allowsnull="false"/>
답변1
awk
대략적인 솔루션:
awk '
{match ($0, / name="[^"]*"/)
R1 = RSTART
L1 = RLENGTH
match ($0, / database_fieldname="[^"]*"/)
R2 = RSTART
L2 = RLENGTH
if (substr ($0, R1+7, L1-8) == substr ($0, R2+21, L2-22)) sub (substr ($0, R2, L2), "")
}
1
' file
<field type="float8" name="something" database_fieldname="SHORT" allowsnull="false"/>
<field type="float8" name="LONG" allowsnull="false"/>
두 개의 대상 필드를 일치시키고, 해당 값을 추출하고, 비교하고, 같으면 두 번째 필드를 빈 문자열로 완전히 바꿉니다.
답변2
검색 패턴에 역참조를 사용할 수 있습니다.
sed -e 's/name="\(.*\)" database_fieldname="\1"/name="\1"/' <input>