developer tip

'+'(하나 이상의 발생)가 'sed'명령과 함께 작동하지 않습니다.

copycodes 2020. 12. 12. 11:28
반응형

'+'(하나 이상의 발생)가 'sed'명령과 함께 작동하지 않습니다.


불필요한 공백, 빈 줄을 제거하고 괄호가 그 사이에 공백과 균형을 이루도록하여 코드를 수정하려고합니다.

    int a = 4;
    if ((a==4) ||   (b==5))

    a++   ;

다음으로 변경해야합니다.

    int a = 4;
    if ( (a==4) || (b==5) )
    a++ ;

대괄호와 빈 줄에 대해 작동합니다. 그러나 여러 공간을 하나의 공간으로 줄이는 것을 잊습니다.

    int a = 4;
    if ( (a==4) ||   (b==5) )
    a++    ;

내 스크립트는 다음과 같습니다.

    #!/bin/bash
    # Script to refine code
    #
    filename=read.txt

    sed 's/((/( (/g' $filename > new.txt
    mv new.txt $filename

    sed 's/))/) )/g' $filename > new.txt
    mv new.txt $filename

    sed 's/ +/ /g' $filename > new.txt
    mv new.txt $filename

    sed '/^$/d' $filename > new.txt
    mv new.txt $filename

또한이 스크립트를보다 간결하게 만드는 방법이 있습니까? 예를 들어 명령 수를 제거하거나 줄이십니까?


당신이 사용하는 경우 GNU가 나오지 당신은 사용할 필요가 sed -r있는 힘 sed의 원하는 행동을 포함한 확장 된 정규 표현식을 사용하는 것 +. 참조 man sed:

-r, --regexp-extended

       use extended regular expressions in the script.

OS X sed를 사용하는 경우에도 동일 하지만 다음을 사용해야합니다 sed -E.

-E      Interpret regular expressions as extended (modern) regular expressions
        rather than basic regular regular expressions (BRE's).

를 앞에 붙여야 +합니다 \. 그렇지 않으면 sed문자 +자체 와 일치 시키려고 합니다.

스크립트를 "스마트"하게 만들기 위해 하나의 sed에 모든 표현식을 축적 할 수 있습니다.

sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt

의 일부 구현은 파일 을 제자리에서 변경할 수 sed있는 -i옵션을 지원합니다 .


때로는 -r 및 -e가 작동하지 않습니다. sed 버전 4.2.1을 사용하고 있으며 전혀 작동하지 않습니다.

빠른 해킹은 대신 * 연산자를 사용하는 것입니다. 따라서 모든 중복 공백 문자를 단일 공백으로 바꾸고 싶다고 가정 해 보겠습니다.

sed 's/ +/ /'

그러나 우리는 이것을 대신 사용할 수 있습니다.

sed 's/  */ /'

(이중 공백에 유의하십시오)


May not be the cleanest solution. But if you want to avoid -E and -r to remain compatible with both versions of sed, you can do a repeat character cc* - that's 1 c then 0 or more c's == 1 or more c's.

Or just use the BRE syntax, as suggested by @cdarke, to match a specific number or patternsc\{1,\}. The second number after the comma is excluded to mean 1 or more.


This might work for you:

sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/  */ /g' $filename >new.txt

on the bash front;

First I made a script test.sh

cat test.sh

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
    SRC=`echo $line | awk '{print $1}'`
    DEST=`echo $line | awk '{print $2}'`
    echo "moving $SRC to $DEST"
    mv $SRC $DEST || echo "move $SRC to $DEST failed" && exit 1
done < "$1"

then we make a data file and a test file aaa.txt

cat aaa.txt
<tag1>19</tag1>
<tag2>2</tag2>
<tag3>-12</tag3>
<tag4>37</tag4>
<tag5>-41</tag5>

then test and show results.

bash test.sh list.txt 
Text read from file: aaa.txt bbb.txt
moving aaa.txt to bbb.txt

참고URL : https://stackoverflow.com/questions/12101440/one-or-more-occurrences-not-working-with-sed-command

반응형