我有一個名為的檔案my.txt:
abc_default_flow
#abc_default_flow -p sam
abc_default_flow -p sam
# abc_default_flow -p david
abc_default_flow -p david -z what_is_it
我想匹配具有多個字串的特定行,并希望匹配包含所有字串的確切行。
我嘗試了下面的一段代碼,但是一旦它匹配部分字串,它就會從回圈中出來,而不是包含所有字串的實際行。
#!/bin/bash -f
f_name=abc_default_flow
p_name=sam
file_content=./my.txt
#echo "file_content: $file_content"
while IFS= read -r file_line
do
echo $file_line
if [[ $file_line != *"#"* ]] && [[ $file_line != "" ]] && echo $file_line | grep -E "${f_name}|${p_name}"; then
#if [[ $file_line != *"#"* ]] && [[ $file_line != "" ]] && echo $file_line | grep -v "${f_name}\|${p_name}"; then
#if [[ $file_line != *"#"* ]] && [[ $file_line != "" ]] && [[ $file_line =~ $f_name ]] && [[ $file_line =~ $p_name ]]; then
if [[ -z "$p_name" ]]; then
f_name=${f_name}_${p_name}
fi
echo "f_name: ${f_name}"
break
fi
done < $file_content
grep 或使用任何其他行程在檔案中找到正確的行的正確方法是什么?
更新:使用下面的代碼,我可以獲得輸出,但是有沒有簡單的方法可以使用 grep 或 sed 或 awk 在單行而不是嵌套的 if 回圈中找到結果。
#!/bin/bash -f
f_name=abc_default_flow
p_name=david
file_content=./my.txt
echo "f_name: $f_name, p_name: $p_name"
while IFS= read -r file_line
do
if [[ $file_line != *"#"* ]] && [[ $file_line != "" ]]; then
echo "l1"
if [[ ! -z "$f_name" ]] && [[ $file_line =~ "$f_name" ]]; then
echo "l2, $file_line, $f_name, $p_name"
if [[ ! -z "$p_name" ]] && [[ $file_line =~ "$p_name" ]]; then
f_name=${f_name}_${p_name}
echo "f_name: ${f_name}"
break
elif [[ ! -z "$p_name" ]] && [[ ! $file_line =~ "$p_name" ]]; then
continue
else
break
fi
fi
fi
done < $file_content
uj5u.com熱心網友回復:
您可以對[[ ]]要查找的兩個字串使用相同的樣式檢查:
if [[ $file_line != *"#"* ]] && [[ $file_line == *"$f_name"* ]] && [[ $file_line == *"$p_name"* ]]; then
...
fi
我洗掉了空字串檢查,因為空行不包含$f_name,$p_name無論如何。
如果您期望sam之后總是會出現,abc_default_flow那么您可以將兩個檢查合并為一個測驗:
if [[ $file_line != *"#"* ]] && [[ $file_line == *"$f_name"*"$p_name"* ]]; then
...
fi
如果我們從整體上看腳本,最好擺脫顯式的逐行回圈。當腳本將處理整個檔案的工具鏈接在一起時,它們會更加慣用。就像是:
sed -r '/^\s*#/d' my.txt | grep "$f_name" | grep "$p_name"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341206.html
