我需要找到一些匹配的字符串regexp pattern
,并将搜索结果表示为数组,以便用循环遍历它),我需要使用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 数组列表中的一个有效单词。当然,它会忽略 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 回答