패턴을 일치시키고 패턴의 일부만 바꾸는 방법은 무엇입니까?

패턴을 일치시키고 패턴의 일부만 바꾸는 방법은 무엇입니까?

내 파일에는 다음과 같은 긴 줄이 있습니다.

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...

쉼표 문자를 새 줄로 바꾸고 싶으므로 출력은 다음과 같습니다.

 5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

보다 구체적으로 말하면, 쉼표는 "5" 문자 앞에 옵니다. "5" 문자 앞에는 항상 공백이 있다는 점에 유의하십시오.

다음을 사용하여 쉼표를 간단히 바꿀 수 있습니다.

#cat file | sed -e $'s/,/\\\n/g'

그러나 쉼표가 때때로 다음과 같이 다른 어색한 위치에 있을 수 있기 때문에 그것만으로는 충분하지 않습니다.

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==...

나는 sed를 사용하는 것을 선호하지만 다른 솔루션도 훌륭합니다. 4시간 동안 인터넷을 검색했지만 정확한 문제에 대한 해결책을 찾을 수 없습니다.

답변1

sed방법:

cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...

sed 's/, \(\S*==\)/\n\1/g' file

산출:

5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042
5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
5FaJmwwoBABC0-frsf9xucw==|...

\S*==- 공백이 아닌 문자의 다음 순서는 ==각 줄의 선행 순서로 처리됩니다.

답변2

더 간단한 해결책 tr은 다음과 같습니다.

cat file | tr "," "\n"

tr쉼표를 찾아서 ,새 줄로 바꾸는 곳은 어디입니까?\n

산출:

5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

쉼표 앞의 공백은 유지됩니다.

관련 정보