一部に一致する文字列をregexp pattern
検索し、検索結果を loop で反復処理するための配列として表す必要があります。使用する必要がありますsed
か? 一般的に、いくつかの文字列を置き換えたいのですが、置き換える前にそれらを分析します。
10860 次
3 に答える
6
sed
と の使用diff
:
sed -i.bak 's/this/that/' input
diff input input.bak
GNUsed
は置換前にバックアップ ファイルを作成し、diff
それらの変更を表示します。ただし、GNU を使用していない場合sed
:
mv input input.bak
sed 's/this/that/' input.bak > input
diff input input.bak
を使用した別の方法grep
:
pattern="/X"
subst=that
while IFS='' read -r line; do
if [[ $line = *"$pattern"* ]]; then
echo "changing line: $line" 1>&2
echo "${line//$pattern/$subst}"
else
echo "$line"
fi
done < input > output
于 2013-06-17T22:01:55.593 に答える
3
これを行う最善の方法は、 を使用grep
して行を取得し、改行を内部フィールド セパレータとして使用して結果を配列に入力することです。
#!/bin/bash
# get just the desired lines
results=$(grep "mypattern" mysourcefile.txt)
# change the internal field separator to be a newline
IFS=$'/n'
# populate an array from the result lines
lines=($results)
# return the third result
echo "${lines[2]}"
配列の結果を反復処理するループを作成することもできますが、より伝統的で単純な解決策は、bash の反復処理を使用することです。
for line in $lines; do
echo "$line"
done
于 2013-06-18T08:57:42.100 に答える
0
参考までに、これは私が楽しみのために作成した同様のコンセプトです。これでファイルをループする方法などを示すと良いと思いました。これは、Linux sudoers ファイルを調べて、valid_words 配列リストに有効な単語の 1 つが含まれていることを確認するスクリプトです。もちろん、コメント「#」と空白の「」行は sed で無視されます。この例では、おそらく無効な行のみを印刷したいでしょうが、このスクリプトは両方を印刷します。
#!/bin/bash
# -- Inspect a sudoer file, look for valid and invalid lines.
file="${1}"
declare -a valid_words=( _Alias = Defaults includedir )
actual_lines=$(cat "${file}" | wc -l)
functional_lines=$(cat "${file}" | sed '/^\s*#/d;/^\s*$/d' | wc -l)
while read line ;do
# -- set the line to nothing "" if it has a comment or is empty line.
line="$(echo "${line}" | sed '/^\s*#/d;/^\s*$/d')"
# -- if not set to nothing "", check if the line is valid from our list of valid words.
if ! [[ -z "$line" ]] ;then
unset found
for each in "${valid_words[@]}" ;do
found="$(echo "$line" | egrep -i "$each")"
[[ -z "$found" ]] || break;
done
[[ -z "$found" ]] && { echo "Invalid=$line"; sleep 3; } || echo "Valid=$found"
fi
done < "${file}"
echo "actual lines: $actual_lines funtional lines: $functional_lines"
于 2014-09-29T16:48:09.127 に答える