'+'(하나 이상의 발생)가 '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
'developer tip' 카테고리의 다른 글
Bash에서 '['뒤와 ']'앞에 공백이 있어야하는 이유는 무엇입니까? (0) | 2020.12.12 |
---|---|
파이썬이 컴파일 된 옵션 목록을 얻는 방법은 무엇입니까? (0) | 2020.12.12 |
Flask와 번들로 제공되는 서버는 프로덕션에서 사용하기에 안전한가요? (0) | 2020.12.12 |
SQL 성능 UNION 대 OR (0) | 2020.12.12 |
Maven Java Home을 변경하는 방법 (0) | 2020.12.12 |